Выражение LINQ 'First ()' не может быть переведено и будет оценено локально. при использовании группового - PullRequest
1 голос
/ 20 октября 2019

После обновления до ef core 3.0. У меня проблемы с группировкой результатов. Если я удаляю раздел группировки, он работает нормально. Но, конечно, мне нужно получить сумму, так что нужно.

IQueryable<ShackGapiModel> models = _context.Offers
                .Where(i => i.Amount > 0)
                .Select(o => new ShackGapiModel
                {
                    Id = o.Shack.Id,
                    Title = o.Shack.Title,
                    AmountOnExchange = o.Amount
                })
                .GroupBy(i => i.Id)
                .Select(s => new ShackGapiModel
                {
                    Id = s.First().Id,
                    Title = s.First().Title,
                    AmountOnExchange = s.Sum(a => a.AmountOnExchange)                   
                });

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Причина этого в том, что EFCore не может перевести ваш запрос linq в запрос sql. Поэтому он берет данные в память и применяет ваш linq после этого. Это очень трудоемкая вещь.

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client

Смягчения

Если запрос не может быть полностью переведен, то либо переписать запрос в формекоторые можно перевести или использовать AsEnumerable (), ToList () или аналогичные для явного возвращения данных клиенту, где они могут быть затем обработаны с использованием LINQ-to-Objects.

В качестве альтернативыКстати, Я предпочитаю использовать Max () , когда принимаем значения, отличные от группового ключа.

IQueryable<ShackGapiModel> models = _context.Offers
                .Where(i => i.Amount > 0)
                .GroupBy(i => i.Id)
                .Select(s => new ShackGapiModel
                {
                    Id = = s.Key.Value,
                    Title = s.Max(a => a.title),
                    AmountOnExchange = s.Sum(a => a.AmountOnExchange)                   
                });
1 голос
/ 21 октября 2019

First () не может быть переведен в sql запросы, но FirstOrDefault () может.

.Select(s => new ShackGapiModel
{
    Id = s.FirstOrDefault().Id,//Option 1
    Title = s.Select(x => x.Title).FirstOrDefault(),//Option 2
    AmountOnExchange = s.Sum(a => a.AmountOnExchange)                   
});

При обновлении вы получили сообщение об ошибке на стороне клиента. Теперь он отключен по умолчанию в EF Core 3, и рекомендуется оставить его отключенным.

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