数据库包含订单。 订单可以包含在一组订单中。 对于每组订单,它可以包含1到多个订单。
但是,Orders可以为NULLO值分配GroupOrderId,因为以前的Orders没有分组概念。只有新订单强制执行添加到组中的概念。
要为每个订单执行操作而要填充的类结构是
public class OrdersGroup
{
public int? GroupOrderId { get; set; }
public List<int> OrderIds { get; set; }
}
linq声明
var workPacketOrdersList = (from o in db.Orders
where
o.GroupOrderId >= groupOrderIdMin && o.GroupOrderId <= groupOrderIdMax &&
o.IsDeleted == false
orderby o.WorkPacketId ascending
group o by o.WorkPacketId
into grp
select new OrdersGroup
{
GroupOrderId = grp.Key,
OrderIds = grp.Select(g => 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<OrdersGroup>
。
如果查询中省略了最终的.ToList(),则返回类型变为IQueryable<OrdersGroup>
无论接下来执行什么操作,结果都是例外,无法将此方法转换为商店表达式。
我尝试将特定的select new OrdersGroup
删除为更通用的select new
,然后对此结果执行操作,以便找到相同的商店表达式异常。
有人可以透露一下这个linq不正确的地方吗?
答案 0 :(得分:11)
这是失败的部分 - grp.Select(g => g.OrderId).ToList()
- 你不能在select子句中有一个.ToList()。删除它,你应该没事。
答案 1 :(得分:6)
问题是LINQ to Entities正在尝试将您的查询转换为SQL。它不知道如何将ToList
转换为SQL,这就是问题所在。您需要从查询中删除对ToList
的调用。
即,
OrderIds = grp.Select(g => g.OrderId).ToList()
LINQ to Entities无法将其转换为SQL。取消通话
OrderIds = grp.Select(g => g.OrderId)
如果您需要OrderIds
成为List<int>
,请在执行查询后调用ToList
。
答案 2 :(得分:2)
这是因为您试图在查询的一部分中调用ToList()
,该查询将成为原始SQL并在源(即SQL Server,而不是CLR)上执行。我不确切知道你的数据是什么,所以我不一定能就如何修复它做出准确的推荐,但我会尝试在此查询之后进行ToList()
调用,或者只是不做全部。 IEnumberable
可能会提供您需要的任何功能,如果您移除Select
来电,ToList()
将返回该功能。
顺便说一句,因为我没有明确,我指的是选择中的ToList()
调用 - (倒数第二行)OrderIds = grp.Select(g => g.OrderId).ToList()
另一个很好。它是在SQL查询的结果上执行的,完全没问题,你只是不能在SQL提供程序执行的查询中调用C#特定的方法。
答案 3 :(得分:1)
您的问题是您在select语句中选择了一个列表。
select new OrdersGroup
{
GroupOrderId = grp.Key,
OrderIds = grp.Select(g => g.OrderId).ToList()
/////////////////////////////////////^^^^^^^^^HERE
}
您需要做的是将OrderIds
更改为IEnumerable<int>
,然后摆脱ToList
。