7

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

但是,Orders 可以有一个分配给 GroupOrderId 的 NULL 值,因为之前的 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 不正确的地方有所了解吗?

4

4 回答 4

11

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

于 2013-08-06T16:54:46.270 回答
7

The problem is that LINQ to Entities is attempting to convert your query into SQL. It doesn't know how translate ToList into SQL, so that's the problem. You need to remove the call to ToList from inside your query.

That is,

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

LINQ to Entities can not convert that to SQL. Remove the call

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

and if you need OrderIds to be a List<int>, do the call to ToList after you execute the query.

于 2013-08-06T16:55:29.800 回答
2

Your problem is that you select a list in your select statement.

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

What you need to do is change OrderIds to an IEnumerable<int>, and then get rid of the ToList.

于 2013-08-06T16:56:07.723 回答
2

这是因为您试图调用ToList()将成为原始 SQL 并在源(即 SQL Server,而不是 CLR)处执行的查询的一部分。我不确切知道您的数据是什么,因此我不一定能就如何修复它提出准确的建议,但我会尝试ToList()在此查询后拨打电话,或者只是不全部拨打。它可能IEnumberable会提供您需要的任何功能,Select如果您删除ToList()呼叫,它将返回。

顺便说一句,由于我没有明确说明,我指的ToList()是 select 内的调用 -(倒数第二行)OrderIds = grp.Select(g => g.OrderId).ToList()另一个很好。它在 SQL 查询的结果上执行,这非常好,您只是不能在 SQL 提供程序执行的查询中调用 C# 特定方法。

于 2013-08-06T16:54:56.993 回答