powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ef core, linq GroupBy
11 сообщений из 11, страница 1 из 1
ef core, linq GroupBy
    #39950922
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

EF core 3.1 , Pomelo.EntityFrameworkCore.MySql
Есть вот такой код
Код: c#
1.
 var res =  _db.OrderProducts.GroupBy(op => op.Product.Cat).ToList();


При попытке выполнения падает с ошибкой "Client side GroupBy is not supported"
Но при этом вот такой код
Код: c#
1.
2.
 var res =  _db.OrderProducts.GroupBy(op => op.Product.Cat).
                                    .Select(g => new {cat = g.Key, sum = g.Sum(p => p.CountAll)})


нормально строит sql и выполняется.
ToDictionary() вместо Select() - тоже падает "Client side GroupBy is not supported"
Это какой то баг или я чего то не понимаю ?
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950928
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950939
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
То есть если я правильно понял ef не может транслировать groupBy() в SQL, а добавление select() позволяет это сделать ?
Но если это так - это же как то ужасно не очевидно. А какая еще функциональность спрятана за сложными комбинациями ??
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950963
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты что хочешь получить в результате группировки?

В результате Select ты получаешь проекцию в виде понятного анонимного класса.
А после GroupBy ты что хочешь получить? IEnumerable.IGrouping<>? С чем ты хочешь List?

Отталкивайся от результата, а не от метода тыка
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950967
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimirzzz
нормально строит sql и выполняется.
ToDictionary() вместо Select() - тоже падает "Client side GroupBy is not supported"
Это какой то баг или я чего то не понимаю ?


Если ваш LINQ не может транслироваться в SQL на 100%, то будет ошибка.

В вашем коде проблема:

Vladimirzzz
Код: c#
1.
 var res =  _db.OrderProducts.GroupBy(op => op.Product.Cat).ToList();



Вы группируете по навигационной сущности и пытаетесь получить группы.
В SQL так нельзя.
Нужно группировать по полю, и выбирать функцию агрегации (Sum, Count, etc).

Когда вы пишите LINQ, представьте себе, как бы в это в SQL транслируете.
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950976
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Ты что хочешь получить в результате группировки?

В результате Select ты получаешь проекцию в виде понятного анонимного класса.
А после GroupBy ты что хочешь получить? IEnumerable.IGrouping<>? С чем ты хочешь List?

Отталкивайся от результата, а не от метода тыка


Спасибо. Да я уже понял. Вместо List я пытался использовать ToDictionary и как я понимаю он в отличие от Select IEnumerable хочет,
поэтому та же ошибка что и при ToList
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950980
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt

Вы группируете по навигационной сущности и пытаетесь получить группы.
В SQL так нельзя.
Нужно группировать по полю, и выбирать функцию агрегации (Sum, Count, etc).

Когда вы пишите LINQ, представьте себе, как бы в это в SQL транслируете.


Спасибо.
Кажется вы не правы. EF core 3 транслирует такой запрос добавляя join для навигационной сущности.
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950993
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimirzzz
Спасибо. Да я уже понял. Вместо List я пытался использовать ToDictionary и как я понимаю он в отличие от Select IEnumerable хочет,
поэтому та же ошибка что и при ToList
Не поэтому.
Тебе нужно четко представлять, где у тебя проходит граница между IQueryable и IEnumerable.
Неважно, чем ты пытаешься материализовать, ToList или ToDictionary, EF не может сделать запрос ДО материализации, потому что там IQueryableGrouping.
Сначала делай проекцию, а потом вызывай материализацию.
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39950995
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
Ты что хочешь получить в результате группировки?

В результате Select ты получаешь проекцию в виде понятного анонимного класса.
А после GroupBy ты что хочешь получить? IEnumerable.IGrouping<>? С чем ты хочешь List?

Отталкивайся от результата, а не от метода тыка


Хотя, с другой стороны, почему бы мне не получить IGrouping<string, OrderProduct> который я наверно получил бы
так:
var list = _db.OrderProducts.ToList()
var groups = list.GroupBy
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39951006
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimirzzz
почему бы мне не получить IGrouping
Потому что ты работаешь с IQueryable. Как ты тебе представляешь SQL-запрос, который должен тебе вернуть иерархическую модель данных?

Хочешь группировку на клиенте - делай на клиенте. Или делай нужную проекцию с сервера, которую можно передать на клиента с помощью SQL-запроса.
...
Рейтинг: 0 / 0
ef core, linq GroupBy
    #39951015
Vladimirzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Я в общем разобрался.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ef core, linq GroupBy
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]