无法创建匿名类型常量值,只能使用基元类型。

6
使用 Entity Framework Version=6.0.0.0 获取如下所示的常见 id 和 orderid。
var dt1 = from p in dt.AsEnumerable()
          select new
          {
              Id = p.Field<int>("Id"),
              OrderId = p.Field<int>("OrderId")
          };

var dt2 = (from order in db.Orders
           select new
           {
               order.Id,
               order.OrderId
           }).ToList();
var intersect = dt1.Intersect(dt2);

根据intersect中的值列表,我需要从订单表中选择所有的值。
尝试使用代码时出现错误:“无法创建只有基元类型的匿名类型的常量值”。
var result= (from a in sync.Orders
              where intersect.Any(b => a.Id == b.Id && a.OrderId == b.OrderId)
              select a).ToList();

这是LINQ to SQL,EF还是其他什么? - Jon Skeet
使用Entity Framework。 - Nirav Parmar
请在问题中包含此信息,最好附带 EF 版本信息。 - Jon Skeet
谢谢Jon!!! 已更新问题.. - Nirav Parmar
1个回答

13

您正在尝试将EF查询与内存数据集"join",但这不起作用,因为没有一种在SQL中嵌入列表和查找的方法。其中一个选项是使用AsEnumerable将整个表拉入内存:

var result= (from a in sync.Orders.AsEnumberable
              where intersect.Any(b => a.Id == b.Id && a.OrderId == b.OrderId)
              select a).ToList();

另一种选择是将 Id OrderId 连接成一个值,然后使用 Contains ,因为它可以被转换为 SQL 中的 IN 子句:

var lookup = intersect.Select(i => i.Id + "-" + i.OrderId).ToList();

var result= (from a in sync.Orders
              where lookup.Contains(a.Id + "-" + a.OrderId)
              select a).ToList();

帮我解决了一个完全不同的问题。干得好@d-stanley! - Cameron Wilby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接