EF ядро ​​Linq groupby и с подсчетом суммы - не может быть переведено и будет оцениваться локально - PullRequest
0 голосов
/ 11 декабря 2018

После ядра .net core EF Linq не может быть переведен и будет оцениваться локально.Не могли бы вы дать мне совет?

var temp1= (from so in context.OrderShippingOrders
            group so by so.OrderId into g
            where g.Count(x=> x.IsSent == true ) == g.Count()
            select new {
                        g.Key
                       }
           );

            query = (from o in context.Orders
                     join s in temp1
                     on o.Id equals s.Key
                     select o
                     );

Выражение LINQ 'присоединяется к AnonymousObject _o в {из порядка o в значении (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1[ECommerce.API.Models.Order]) where ([o].ShopId == __queryObj_ShopId_Value_0) join <>f__AnonymousType18 1 с в {из IGrouping2 g in {from OrderShippingOrder so in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 1 [ECommerce.API.Models.OrderShippingOrder]) orderby [так] .OrderId asc, [так] .OrderId asc select [так] => GroupBy ([так] .OrderId, [так])} где ({из OrderShippingOrder x в [g] где ([x] .IsSent == True) выберите [x] => Count ()} == {[g] => Count ()}) выберите новый <> f__AnonymousType18 1(Key = [g].Key)} on [o].Id equals [s].Key orderby EF.Property(?[o]?, "Id") asc select new AnonymousObject(new [] {Convert(EF.Property(?[o]?, "Id"), Object)}) => Skip(__p_1) => Take(__p_2) => Distinct()} on Property([o.OrderDetails], "OrderId") equals Convert([_o].GetValue(0), Nullable 1) 'не может быть переведено и будет оцениваться локально.

1 Ответ

0 голосов
/ 12 декабря 2018

Если возможно, обновитесь до EF Core 2.1 (или 2.2), чтобы улучшить Перевод LINQ GroupBy .

До версии 2.1 в EF Core оператор GroupBy LINQвсегда будет оцениваться в памяти.Теперь мы поддерживаем перевод его в предложение SQL GROUP BY в большинстве распространенных случаев.

Ничего нельзя сделать в предыдущих версиях EF Core.

После обновления, чтобы получитьВ SQL-запросе GroupBy необходимо изменить, чтобы использовать промежуточную проекцию и условную Sum вместо условной Count, например:

var temp1 = (from so in context.OrderShippingOrders
             group new { SendCount = so.IsSent ? 1 : 0 } by so.OrderId into g
             where g.Sum(x => x.SendCount) == g.Count()
             select new
             {
                 g.Key
             }
);

(к сожалению, более естественные group so и g.Sum(x => x.IsSent ? 1 : 0)не переводит, поэтому нам нужны group new { SendCount = so.IsSent ? 1 : 0 } и g.Sum(x => x.SendCount))


PS. Если у вас есть свойство навигации по коллекции от Order до OrderShippingOrder (что-то вроде public ICollection<OrderShippingOrder> Shipping { get; set; }),тогда вы можете избежать всех этих GroupBy осложнений и использовать просто:

var query = context.Orders
    .Where(o => o.Shipping.Count(so => so.IsSent) == o.Shipping.Count());
...