EFCore 3.1 - существует запрос через Any; Запрос не может быть переведен - PullRequest
1 голос
/ 06 февраля 2020

Мы используем EFCore 3.1 и пытаемся построить запрос с помощью Exists с помощью .Any (), который охватывает 2 свойства.

var selectionCriteria = someHugeList.Select(sh => new { sh.Id, sh.StatusCode }).ToList()
var resultsQry = _myContext.SomeClass
                           .Include(sc => sc.DetailRecords)
                           .Where(sc => selectionCriteria.Any(crit => crit.Id == sc.Id 
                                                                   && crit.StatusCode == sc.StatusCode));

var results = await resultsQry.ToListAsync()

При выполнении этого запроса (даже с небольшим количеством (5 items) элементов критериев выбора: выдается следующее сообщение об ошибке:

System.InvalidOperationException: выражение LINQ 'DbSet .Where (c => __selectionCriteria_0 .Any (crit => crit.Id == s c .Id && crit.StatusCode == s c .StatusCode)) 'не может быть переведен. Перепишите запрос в форме, которую можно перевести, или переключитесь на оценку клиента явным образом, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsyn c (). Для получения дополнительной информации см. https://go.microsoft.com/fwlink/?linkid=2101038. '

Кажется, проблема заключается в Тот факт, что в предложении .Any есть 2 свойства. A, где существует в sql, обычно может сделать это без проблем. Кажется, что EFCore затрудняется.

У кого-нибудь есть идеи, как решить эту проблему? s?

1 Ответ

0 голосов
/ 06 февраля 2020

только что нашел это; https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq - запросы, которые больше не оцениваются на клиенте

Короче говоря; оценка клиента больше не работает в EFCore 3.1, что означает, что этот тип запроса (сравнение списка клиентов со списком серверов) не работает. Вы должны принести это клиенту. Мой коллега указал мне только сейчас, что я не оценил сообщение об ошибке в его полном объеме :).

Изменил мой запрос следующим образом (не оптимально, но другого решения пока нет):

var selectionCriteria = someHugeList.Select(sh => new { sh.Id, sh.StatusCode }).ToList()
var resultsQry = _myContext.SomeClass
                           .Include(sc => sc.DetailRecords)
                           .AsEnumerable() // this is the important part, pulling all the records client side so we can execute the .Any on the client.
                           .Where(sc => selectionCriteria.Any(crit => crit.Id == sc.Id 
                                                                   && crit.StatusCode == sc.StatusCode));

var results = await resultsQry.ToList() // no more async, because clientside
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...