【问题标题】:unable to create a constant value of type anonymous type only primitive types无法创建类型为匿名类型的常量值,只有原始类型
【发布时间】:2015-06-25 23:35:13
【问题描述】:

使用Entity Framework Version=6.0.0.0来获取common 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);

基于相交的值列表。我需要从订单表中选择所有值。

尝试使用的代码出现错误“无法创建类型为匿名类型的常量值,仅限原始类型”

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 还是别的什么?
  • 使用实体框架。
  • 请将其包含在问题中 - 最好包含 EF 版本信息。
  • 谢谢乔恩!!!更新了问题..

标签: c# linq entity-framework


【解决方案1】:

您正在尝试将 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();

【讨论】:

  • 帮助我解决了一个完全独立的问题。不错的@d-stanley!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多