Простейшая группировка с ошибками в EF 3.x с «Клиентская группа GroupBy не поддерживается» - PullRequest
2 голосов
/ 13 февраля 2020

В настоящее время проводится тестирование с EF Core версии 3.1.1.

При поиске я нахожу ссылки на эту проблему, но не вижу однозначных ответов о том, почему это происходит, и является ли это ошибкой. это будет исправлено или, если это ожидаемое поведение. Это так же просто, как выглядит - таблица / сущность BatchRequest имеет целочисленный столбец / свойство с именем BatchId:

var batchRequestGroups = context.BatchRequests.GroupBy(br => br.BatchId).ToList();

Когда я запускаю это, я получаю исключение System.InvalidOperationException, "GroupBy на стороне клиента не поддерживается. "

Итак, исходя из объяснений, которые я нахожу в Интернете, похоже, что EF Core 3.x больше не будет разрешать GroupBys на стороне клиента, кроме как в проекции верхнего уровня.

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

Старое поведение

До версии 3.0, когда EF Core не мог преобразовать выражение, являющееся частью запроса, в SQL или параметр, он автоматически оценивал выражение на клиенте. По умолчанию клиентская оценка потенциально дорогих выражений только выдает предупреждение.

Новое поведение

Начиная с версии 3.0, EF Core допускает только выражения в проекции верхнего уровня ( последний вызов Select () в запросе) для оценки на клиенте. Если выражения в любой другой части запроса не могут быть преобразованы в SQL или в параметр, возникает исключение.

Означает ли это, что в предыдущих версиях ALL Предложения GroupBy были оценены на клиенте?

Кроме того, почему GroupBy в моем примере не может быть оценен в SQL? И как GroupBy моего примера не является проекцией верхнего уровня?

Опять же, мой главный вопрос: это ошибка или ожидаемое поведение?

1 Ответ

1 голос
/ 13 февраля 2020

Начиная с EF 3.0, оценка запросов на стороне клиента рассматривается как ошибка, в отличие от предыдущих версий, где она рассматривалась как предупреждение.

Означает ли это, что в предыдущих версиях все предложения GroupBy оценивались на клиенте?

НЕТ. Не все утверждения группы были оценены на стороне клиента. Это зависит от того, удалось ли ядру EF преобразовать LINQ в поддерживаемый оператор SQL.

Кроме того, почему GroupBy в моем примере не может быть оценен в SQL? И как GroupBy моего примера не является проекцией верхнего уровня?

Я предполагаю, что ваша сущность содержит другие отношения и загрузку и группировку ядра EF по указанному свойству, что невозможно сделать в SQL.

Опять же, мой главный вопрос: это ошибка или ожидаемое поведение?

Это, очевидно, не ошибка. Это ожидаемое поведение.

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