Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EF core Linq groupby和具有总和计数-无法转换,将在本地进行计算_Linq_Asp.net Core_Ef Core 2.0 - Fatal编程技术网

EF core Linq groupby和具有总和计数-无法转换,将在本地进行计算

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 {

在.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 {
                        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 igroup
2 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匿名类型18
1(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