EF core Linq groupby和具有总和计数-无法转换,将在本地进行计算
在.net core EF core之后,Linq无法转换,将在本地进行评估。你能给我一个建议吗EF core Linq groupby和具有总和计数-无法转换,将在本地进行计算,linq,asp.net-core,ef-core-2.0,Linq,Asp.net Core,Ef Core 2.0,在.net core EF core之后,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 {
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表达式“join AnonymousObject{from Order o in value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1[ECommerce.API.Models.Order]),其中([o].ShopId=={queryObj_ShopId_value_0)在{from igroup2 g in{from Order shippingorder so in value中加入f_AnonymousType18
1 s(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable
1[ECommerce.API.Models.OrderShippingOrder])orderby[so].OrderId asc[so].OrderId asc select[so]=>GroupBy([so].OrderId[so])where({from OrderShippingOrder x in[g]where([x].IsSent==True)select[x]=>Count()}======={[g]>Count}选择新的f\U匿名类型181(Key=[g].Key)}在[o].Id等于[s]。Key orderby EF.Property(?[o],“Id”)asc选择新的匿名对象(new[]{Convert(EF.Property(?[o],“Id”),Object}=>Skip(u p_1)=>Take(u p_2)=>Distinct()}在属性([o.OrderDetails],“OrderId”)等于Convert([u o].GetValue(0),null
1)'无法翻译,将在本地进行评估。如果可能,请升级到EF Core 2.1(或2.2)以获得改进
在版本2.1之前,在EF Core中,GroupBy LINQ操作符将始终在内存中计算。在大多数常见情况下,我们现在支持将其转换为SQL GROUP BY子句
在以前的EF核心版本中,您无法执行任何操作
升级后,为了获得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
}
);
(不幸的是,更自然的组so
和g.Sum(x=>x.IsSent?1:0)
没有翻译,这就是为什么我们需要组new{SendCount=so.IsSent?1:0}
和g.Sum(x=>x.SendCount)
)
另外,如果您拥有从
Order
到OrderShippingOrder
(类似于public ICollection Shipping{get;set;}
)的集合导航属性,那么您可以避免所有这些GroupBy
复杂性,只需使用:
var query = context.Orders
.Where(o => o.Shipping.Count(so => so.IsSent) == o.Shipping.Count());
尝试将
g.Count(x=>x.IsSent==true)==g.Count()
更改为g.All(x=>x.IsSent)
谢谢。但是,我只想返回所有发货订单都标记为已发送的订单ID。(注意:一个订单可能有多个发货订单)嗨,迈克尔,谢谢。我现在知道你的意思了。“全部”与我的代码相比更简单。但是,它仍然无法在服务器端翻译。默认情况下,执行客户端评估时,EF Core将记录警告。请参阅。如果效率低下,请尝试使用。将asp.net Core升级到2.2(包括ET Core升级到2.2)后,仍然存在相同的错误。我知道。因此升级是必要的,但还不够。请回答更新D