LINQ – 过滤子集合

我希望能够查询父实体并过滤子集合的内容。

例如,我有一个OrderHeaders集合。 我想使用LINQ查询此集合以返回所有OrderHeaders,但我只想要包含一些相关的OrderDetail行。

我最好寻找一个解决方案,我可以在一个LINQ语句中完成所有这些。

以下控制台应用程序演示了此。

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LINQ { class Program { static void Main(string[] args) { List orders = GetOrderHeaders(); var filteredOrders = from p in orders where p.Detail.Where(e => e.StockCode == "STK2").Count() > 0 select p; foreach (var order in filteredOrders) { Console.WriteLine("Account {0} ", order.AccountCode); foreach (var detail in order.Detail) { Console.WriteLine("StockCode {0}, Quantity {1}", detail.StockCode, detail.Quantity); } Console.WriteLine(); } // The above will return the following: // Account CUST1 // StockCode STK1, Quantity 1 // StockCode STK2, Quantity 2 // // Account CUST2 // StockCode STK2, Quantity 1 // StockCode STK4, Quantity 2 // How can I get the following? // Account CUST1 // StockCode STK2, Quantity 2 // // Account CUST2 // StockCode STK2, Quantity 1 Console.ReadLine(); } public static List GetOrderHeaders() { List orders = new List(); OrderHeader header = new OrderHeader { AccountCode = "CUST1", Detail = new List()}; header.Detail.Add( new OrderDetail { StockCode = "STK1", Quantity = 1 }); header.Detail.Add( new OrderDetail { StockCode = "STK2", Quantity = 2 }); orders.Add(header); header = new OrderHeader { AccountCode = "CUST2", Detail = new List() }; header.Detail.Add( new OrderDetail { StockCode = "STK2", Quantity = 1 }); header.Detail.Add( new OrderDetail { StockCode = "STK4", Quantity = 2 }); orders.Add(header); return orders; } } public class OrderHeader { public string AccountCode { get; set; } public List Detail {get; set;} } public class OrderDetail { public string StockCode { get; set; } public int Quantity { get; set; } } } 

非常感谢任何建议。

保罗

请尝试以下方法:

 var filtered = orders .Where(o => o.Detail.Any(d => d.StockCode == "STK2")) .Select(o => new { Order = o, Details = o.Detail.Where(d => d.StockCode == "STK2") }); 

那么可以这样使用:

 foreach (var entity in filtered) { Console.WriteLine("Account {0} ", entity.Order.AccountCode); foreach (var detail in entity.Details) { Console.WriteLine("StockCode {0}, Quantity {1}", detail.StockCode, detail.Quantity); } Console.WriteLine(); }