无法创建类型为仅匿名类型的基元类型的常量值

本文关键字:类型 常量 创建 | 更新日期: 2023-09-27 17:59:47

使用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();

无法创建类型为仅匿名类型的基元类型的常量值

您正试图将EF查询与内存中的数据集"联接"在一起,但由于无法在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();

另一种选择是将IdOrderId连接为一个值并使用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();