LINQ to Entities无法将方法Generic.List(int)识别为Generic.IEnumerable(int)方法

数据库包含订单。 订单可以包含在一组订单中。 对于每组订单,它可以包含1到多个订单。

但是,Orders可以为NULLO值分配GroupOrderId,因为之前的Orders没有分组概念。 只有新订单强制执行添加到组的概念。

要为每个订单执行操作而要填充的类结构是

public class OrdersGroup { public int? GroupOrderId { get; set; } public List OrderIds { get; set; } } 

linq声明

 var workPacketOrdersList = (from o in db.Orders where o.GroupOrderId >= groupOrderIdMin && o.GroupOrderId  g.OrderId).ToList() }).ToList(); 

完全例外

 LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable`1[System.Int32])' method, and this method cannot be translated into a store expression. 

我看到linq查询的返回类型是List

如果查询中省略了最终的.ToList(),则返回类型将变为IQueryable

无论接下来执行什么操作,结果都是exception,即此方法无法转换为商店表达式。

我试图将特定的select new OrdersGroup删除为更通用的select new ,然后对此结果执行操作,以便找到相同的商店表达式exception。

有人可以透露一下这个linq不正确的地方吗?

这是失败的部分 – grp.Select(g => g.OrderId).ToList() – 你不能在select子句中有一个.ToList()。 删除它,你应该没事。

问题是LINQ to Entities正试图将您的查询转换为SQL。 它不知道如何将ToList转换为SQL,这就是问题所在。 您需要从查询中删除对ToList的调用。

那是,

 OrderIds = grp.Select(g => g.OrderId).ToList() 

LINQ to Entities无法将其转换为SQL。 删除通话

 OrderIds = grp.Select(g => g.OrderId) 

如果需要OrderIdsList ,请在执行查询后调用ToList

这是因为您试图在查询的一部分中调用ToList() ,该查询将成为原始SQL并在源(即SQL Server,而不是CLR)上执行。 我不确切知道你的数据是什么,所以我不一定能就如何修复它做出准确的建议,但是我会尝试在这个查询之后进行ToList()调用,或者只是不做全部。 IEnumberable可能会提供您需要的任何function,如果您删除ToList()调用, Select将返回该function。

顺便说一句,因为我没有明确,我指的是select中的ToList()调用 – (倒数第二行) OrderIds = grp.Select(g => g.OrderId).ToList()另一个很好。 它是在SQL查询的结果上执行的,完全没问题,你只是不能在SQL提供程序执行的查询中调用C#特定的方法。

您的问题是您在select语句中选择了一个列表。

 select new OrdersGroup { GroupOrderId = grp.Key, OrderIds = grp.Select(g => g.OrderId).ToList() /////////////////////////////////////^^^^^^^^^HERE } 

您需要做的是将OrderIds更改为IEnumerable ,然后删除ToList