【问题标题】:Match 2 property of any object in local list using Linq使用 Linq 匹配本地列表中任何对象的 2 属性
【发布时间】:2020-04-20 05:48:52
【问题描述】:
    public class OrderItem
    {
        public int OrderID { get; set; }
        public int ProductionID { get; set; }
    }

    public class InventoryItem
    {
        public int InventoryItemID{ get; set; }
        public int OrderID { get; set; }
        public int ProductionID { get; set; }
        public bool Created { get; set; }
        public bool Deleted { get; set; }
    }

使用这些示例对象,

我有一个 orderItems 的本地列表,并且想要查询 OrderID 和 ProductionID 在我的任何 Order Items 列表中的任何一个属性上都匹配的库存项目

我在下面尝试了 linq 查询,但出现错误

我正在尝试的查询:

    var results = await db.InventoryItems.Where(d =>
                  listOfOrderItems.Any(o => o.OrderID == d.OrderID && !d.DeleteFlag && d.ProductionId == o.ProductionItemId))
                  .Select(t => t.InventoryItemID).ToListAsync();

抛出异常:EntityFramework.SqlServer.dll 中的“System.NotSupportedException”

编辑 我被提到这个问题:Using Linq to Sql asynchronously with new async/await

但我的问题不是关于异步等待,而是关于使用列表中的 .any 匹配的 2 个属性

【问题讨论】:

标签: c# sql entity-framework linq-to-sql


【解决方案1】:

试试这个:

var localIdPairs = listOfOrderItems.Select(x => x.OrderId + "-" + x.ProductionItemId).ToList();

var results = await db.InventoryItems
          .Where(d => !d.DeleteFlag && 
                      localIdPairs.Contains(d.OrderId + "-" + d.ProductionItemId))
          .Select(t => t.InventoryItemID).ToListAsync();

【讨论】:

  • 这行不通,因为我需要它来匹配同一个对象的两个属性
  • 不错 :) 喜欢创意!它可能确实有效,但对我来说感觉像是一种黑客行为,只是想知道是否有更官方的方式
【解决方案2】:

进一步查看错误我发现了这个错误:

在此上下文中仅支持原始类型或枚举类型。

我的集合 listOfOrderItems 是 List 类型,将其更改为 IEnumerable 解决了我的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多