Если возможно, обновитесь до 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());