EF Core 3 x.Contains () в выражении, где x - ICollection - PullRequest
3 голосов
/ 29 сентября 2019

У меня есть следующие настройки уровня данных:

public class Repository : IRepository {

    private readonly MyDbContext _dbContext;

        public List<Meter> Search(Expression<Func<Meter,bool>> criteria)
            IQueryable<Meter> results = _dbContext.Meters;
            return results.Where(criteria).ToList();
        }
    }
}

... from a client class:

IRepository _repository;

public void ClientMethod () {

    ICollection<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); // This throws exception

}

Это приводит к исключению:

выражение Где (источник: DbSet, предикат: (m) => (Необработанный параметр: __ids_0) .Contains (m.Id)) 'не может быть переведен. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsync ()

Ноесли я изменю ссылку на коллекцию на IEnumerable или List, она будет работать:

public void ClientMethod () {

    // This works
    List<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); 

    // This works
    IEnumerable<int> ids = new List<int>() {1, 2, 3);
    var results = _repository.Search(c=> ids.Contains(c.Id)); 
}

Почему она не работает для ICollection, а работает для IEnumerable и List? Многие из моих клиентских методов принимают ICollection в качестве параметра.

Я использую EF Core 3.0, но я считаю, что у меня была та же проблема в 2.1, она просто не вылетала, поскольку вместо этого оценивала ее на клиенте.

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Это известная ошибка, исправленная в 3.1. 3.0 практически невозможно использовать из-за всех регрессий после перезаписи конвейера запросов.

Рекомендую использовать трекер ошибок на github для ef core

4 голосов
/ 30 сентября 2019

Я столкнулся с той же проблемой при переходе на EF Core 3.0 с версии 2.2. Я настроил ef раньше, чтобы выдавать ошибку при оценке на стороне клиента, и он работал нормально. Так что я уверен, что это новая проблема с 3.0, появившаяся, когда они переписали движок linq.

Преобразование его в IEnumerable или List также работает для меня, спасибо за подсказку!

...