TakeWhile не работает по непонятной причине - PullRequest
1 голос
/ 29 мая 2020

В моем следующем запросе Linq, который я выполняю для экземпляра SQL Server 2012, я пытаюсь прочитать самые последние записи до ранее установленного маркера MasterId (который является Guid).

var cdc = crm.CdcContacts
             .Include("CdcMaster")
             .OrderByDescending(x => x.CreatedOn)
             .TakeWhile(x => x.MasterId != marker)
             .OrderBy(x => x.CreatedOn);

Однако это не удается.

"Обработка выражения LINQ 'DbSet \ r \ n
.OrderByDescending (x => x.CreatedOn) \ r \ n. TakeWhile (x => x.Id! = New Guid (\ "ABFF5734-F59F-EA11-80CB-005056BC5333 \")) 'сбой' NavigationExpandingExpressionVisitor '. Это может указывать на ошибку или ограничение в EF Core. См. https://go.microsoft.com/fwlink/?linkid=2101433 для получения более подробной информации. "

Ссылка в сообщении об ошибке ведет на страницу оценки клиента и сервера, поэтому я почти уверен, что TakeWhile может не подлежит оценке - я знаю, что курсор logi c не работает таким же образом в более старых версиях SQL Server, возможно, это могло быть объяснением.

Когда я заменяю TakeWhile с простым Take(10) все работает - это аккуратно оценивается как SELECT TOP 10 *, но я не получаю вывода из сгенерированного SQL через фабрику регистратора консоли до того, как произойдет исключение.

Может ли кто-нибудь помочь мне понять, какие возможные причины могут существовать для этого TakeWhile, чтобы не работать?

1 Ответ

1 голос
/ 29 мая 2020

Это исключение указывает на неподдерживаемый метод LINQ.

I wi sh EF Core предоставил документацию со списком поддерживаемых / неподдерживаемых методов LINQ (и свойств / методов CLR), таких как EF6, но до сих пор они этого не делали, поэтому это метод проб и ошибок.

Но TakeWhile и SkipWhile определенно являются одними из неподдерживаемых (и я думаю, что они никогда не будут). Я не уверен, почему Queryable вообще их содержит - вероятно, для совместимости с методами Enumerable. Но AFAIK ни один поставщик запросов (кроме LINQ to Object, конечно) не реализует их, поскольку у них нет естественного перевода в SQL.

Вы, конечно, можете переключиться на методы EnumerableAsEnumerable() as объяснено в ссылке), но в целом это нехорошо. Лучше express ваш запрос с другими стандартными операторами LINQ.


PS База данных и поставщик базы данных EF Core не имеют значения - вышеупомянутые методы не поддерживаются процессором запросов EF Core LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...