查询c#列表以限制子项但返回父项
我有一个嵌套的列表结构,其中包含客户->订单->订单项。我试图找到一个LINQ或其他查询,它将返回OrderItem quantity=1的客户及其嵌套项目。但是,如果数量!=一, 我试过这个:查询c#列表以限制子项但返回父项,c#,linq,C#,Linq,我有一个嵌套的列表结构,其中包含客户->订单->订单项。我试图找到一个LINQ或其他查询,它将返回OrderItem quantity=1的客户及其嵌套项目。但是,如果数量!=一, 我试过这个: var customers2 = customers.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1))); 它只正确返回订单项数量为1的客户,但也返回所有其他订单和订单项 我可以通过两个
var customers2 = customers.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)));
它只正确返回订单项数量为1的客户,但也返回所有其他订单和订单项
我可以通过两个For-each循环获得所需的结果,但我想找到更优雅的:
foreach (var customer in customers2)
{
customer.Orders = customer.Orders.Where(o => o.OrderItems.Exists(oi => oi.Quantity == 1)).ToList();
foreach (var order in customer.Orders)
{
order.OrderItems = order.OrderItems.Where(oi => oi.Quantity == 1).ToList();
}
}
下面是对象结构和一些示例数据
public class Customer
{
public int CustomerId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int OrderId { get; set; }
public int CustomerId { get; set; }
public DateTime OrderDate { get; set; }
public bool Shipped { get; set; }
public List<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public int OrderItemId { get; set; }
public int OrderId { get; set; }
public string ItemName { get; set; }
public int Quantity { get; set; }
}
var customers = new List<Customer>
{
new Customer
{
CustomerId = 1,
Name = "Shawn",
Address = "123 Main Street",
Orders = new List<Order>()
{
new Order()
{
OrderId = 100,
CustomerId = 1,
OrderDate = DateTime.Now,
Shipped = true,
OrderItems = new List<OrderItem>()
{
new OrderItem()
{
OrderItemId = 200,
OrderId = 100,
ItemName = "Computer",
Quantity = 1
},
new OrderItem()
{
OrderItemId = 206,
OrderId = 100,
ItemName = "Hard Drive",
Quantity = 2
}
}
},
new Order()
{
OrderId = 106,
CustomerId = 1,
OrderDate = DateTime.Now,
Shipped = true,
OrderItems = new List<OrderItem>()
{
new OrderItem()
{
OrderItemId = 207,
OrderId = 106,
ItemName = "Monitor",
Quantity = 3
},
new OrderItem()
{
OrderItemId = 208,
OrderId = 106,
ItemName = "DVD Burner",
Quantity = 2
}
}
}
}
},
new Customer
{
CustomerId = 2,
Name = "Arianna",
Address = "456 Main Street",
Orders = new List<Order>()
{
new Order()
{
OrderId = 101,
CustomerId = 2,
OrderDate = DateTime.Now.AddDays(-10),
Shipped = true,
OrderItems = new List<OrderItem>()
{
new OrderItem()
{
OrderItemId = 201,
OrderId = 101,
ItemName = "barbie",
Quantity = 2
}
}
}
}
},
new Customer
{
CustomerId = 3,
Name = "Ryan",
Address = "789 Main Street",
Orders = new List<Order>()
{
new Order()
{
OrderId = 102,
CustomerId = 3,
OrderDate = DateTime.Now.AddDays(-5),
Shipped = true,
OrderItems = new List<OrderItem>()
{
new OrderItem()
{
OrderItemId = 203,
OrderId = 103,
ItemName = "Minecraft",
Quantity = 2
}
}
}
}
}
};
公共类客户
{
public int CustomerId{get;set;}
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共列表顺序{get;set;}
}
公共阶级秩序
{
公共int-OrderId{get;set;}
public int CustomerId{get;set;}
public DateTime OrderDate{get;set;}
公共bool{get;set;}
公共列表OrderItems{get;set;}
}
公共类OrderItem
{
公共整型OrderItemId{get;set;}
公共int-OrderId{get;set;}
公共字符串ItemName{get;set;}
公共整数数量{get;set;}
}
var客户=新列表
{
新客户
{
CustomerId=1,
Name=“Shawn”,
地址=“主街123号”,
订单=新列表()
{
新秩序()
{
OrderId=100,
CustomerId=1,
OrderDate=DateTime。现在,
Shipped=true,
OrderItems=新列表()
{
新订单项()
{
OrderItemId=200,
OrderId=100,
ItemName=“计算机”,
数量=1
},
新订单项()
{
OrderItemId=206,
OrderId=100,
ItemName=“硬盘驱动器”,
数量=2
}
}
},
新秩序()
{
OrderId=106,
CustomerId=1,
OrderDate=DateTime。现在,
Shipped=true,
OrderItems=新列表()
{
新订单项()
{
OrderItemId=207,
OrderId=106,
ItemName=“监视器”,
数量=3
},
新订单项()
{
OrderItemId=208,
OrderId=106,
ItemName=“DVD刻录机”,
数量=2
}
}
}
}
},
新客户
{
CustomerId=2,
Name=“阿里安娜”,
Address=“456大街”,
订单=新列表()
{
新秩序()
{
OrderId=101,
CustomerId=2,
OrderDate=DateTime.Now.AddDays(-10),
Shipped=true,
OrderItems=新列表()
{
新订单项()
{
OrderItemId=201,
OrderId=101,
ItemName=“芭比”,
数量=2
}
}
}
}
},
新客户
{
CustomerId=3,
Name=“Ryan”,
Address=“789大街”,
订单=新列表()
{
新秩序()
{
OrderId=102,
CustomerId=3,
OrderDate=DateTime.Now.AddDays(-5),
Shipped=true,
OrderItems=新列表()
{
新订单项()
{
OrderItemId=203,
OrderId=103,
ItemName=“Minecraft”,
数量=2
}
}
}
}
}
};
我想有一个较短的解决方案,但这是可行的:
var goodCusts = new List<Customer>();
foreach(var customer in customers)
{
var testCust = customer;
for (int i = testCust.Orders.Count - 1; i >= 0; i--)
{
if (testCust.Orders[i].OrderItems.Count != 1)
testCust.Orders.RemoveAt(i);
}
if (testCust.Orders.Any())
goodCusts.Add(testCust);
}
var goodCusts=new List();
foreach(客户中的var客户)
{
var testCust=客户;
对于(int i=testCust.Orders.Count-1;i>=0;i--)
{
if(testCust.Orders[i].OrderItems.Count!=1)
测试客户订单移除(i);
}
if(testCust.Orders.Any())
goodCusts.Add(testCust);
}
不过,它确实创建了一个新集合。它只是通过每个客户运行,删除所有带有
OrderItems.Count!=1
,然后测试该客户是否有剩余的订单。如果有,它将被添加到列表
结果中。您使用的路径是正确的
var customers2 = customers
.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)));
你只是
var customers2 = customers
.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)))
.Select(c => c.Orders.Where(o => o.OrderItems(o => o.OrderItems.Exists(oi => oi.Quantity == 1)));
var customers2 = customers
.Where(c => c.Orders.Any(o => o.OrderItems.Exists(oi => oi.Quantity == 1)))
.Select(c => new
{
Customer = c,
FilteredOrders = c.Orders.Where(o => o.OrderItems(o => o.OrderItems.Exists(oi => oi.Quantity == 1))
});
foreach(var cust in customers2)
{
cust.Customer // your original Customer object
cust.Customer.Orders // your original orders collection for this Customer
cust.FilteredOrders // only the orders you're interested in for this customer
}
var customers2 = customers.Where(x => x.Orders != null && x.Orders.Any(y => y.OrderItems != null && y.OrderItems.Any(z => z.Quantity == 1)));
customers2.ToList().ForEach(x =>
{
x.Orders.ForEach(y =>
{
y.OrderItems.RemoveAll(z => z == null || z.Quantity != 1);
});
x.Orders.RemoveAll(y => y == null || y.OrderItems.Count == 0);
});
return customers2;
public static List<Customer> GetCustomersWithOrderItemQuantity(List<Customer> customers, int quantity)
{
var customers2 = customers.TakeWhile(c => c.Orders.Any(o => o.OrderItems.Any(oi => oi.Quantity == quantity))).ToList();
customers2.ForEach(cust => cust.Orders.ForEach(o => o.OrderItems.RemoveAll(oi => oi.Quantity != quantity)));
return customers2;
}
var customers2 = GetCustomersWithOrderItemQuantity(customers, 1);
public static IEnumerable<Customer> GetCustomersWithOrderItemQuantity(List<Customer> customers, int quantity)
{
return customers.TakeWhile(c => c.Orders.Any(o => o.OrderItems.Any(oi => oi.Quantity == quantity)));
}