C# LINQ sub-where

本文关键字:sub-where LINQ | 更新日期: 2023-09-27 18:05:39

我有一个对象

   public class OrderItem
   {
      public string idProduct { get; set; }
      public int quantity { get; set; }
      public List<WarehouseItem> WarehouseInfo = new List<WarehouseItem>();
   }
   public class WarehouseItem
   {
       public string Name{ get; set; }
       public string LocnCode{ get; set; }
   }

和我需要选择的项目有WarehouseInfo。LocnCode == "A1"

当我使用像

这样的东西时,它不起作用
var items = itemList.Where(x => x.WarehouseInfo.Where(y => y.LocnCode.Equals("A1")));

C# LINQ sub-where

您的需求可以有三种解释方式之一,所以这里有三种解决方案:

  1. 给我所有OrderItems,其中任何WarehouseItemLocnCode"A1":

    var items = itemList.Where(i => i.WarehouseInfo.Any(w => w.LocnCode  == "A1"));
    
  2. 给我OrderItem s中LocnCode大于"A1"的所有WarehouseItem s:

    var items = itemList.SelectMany(i => i.WarehouseInfo)
                        .Where(w => w.LocnCode.Equals("A1"));
    
  3. 给我所有OrderItems,其中任何WarehouseItem具有LocnCode"A1",并将WarehouseInfo过滤为仅那些WarehouseItem s:
这不能在一个简单的Linq查询中完成,因为没有办法改变现有对象的内容。您必须创建新的对象与筛选值:
    var items = itemList.Where(i => i.WarehouseInfo.Any(w => w.LocnCode  == "A1"))
                        .Select(i => new OrderItem
                                     {
                                         idProduct     = i.idProduct, 
                                         quantity      = i.quantity,
                                         WarehouseInfo = i.WarehouseInfo.Where(w => w.LocnCode.Equals("A1"));
                                                                        .ToList()
                                     }
                               );

Try

var items = itemList.Where(x => x.WarehouseInfo.Any(y => y.LocnCode.Equals("A1")));

Where接受一个应该返回bool的谓词。对于给定的谓词,如果集合中至少有一个项返回true,则Any将返回true。