LINQ to Entities无法识别Generic.List(int)到Generic.IEnumerable(in

本文关键字:Generic int IEnumerable in to List 识别 LINQ Entities | 更新日期: 2023-09-27 18:26:35

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

但是,由于以前的订单没有分组概念,因此订单可以为GroupOrderId分配NULL值。只有新订单才能强制执行添加到组中的概念。

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

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哪里不正确吗?

LINQ to Entities无法识别Generic.List(int)到Generic.IEnumerable(in

这是失败的部分-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)

如果您需要OrderIds作为List<int>,请在执行查询后调用ToList

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

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

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

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

您需要做的是将OrderIds更改为IEnumerable<int>,然后去掉ToList