LINQ-过滤子集合 [英] LINQ - filter child collection
本文介绍了LINQ-过滤子集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望能够查询父实体并过滤子集合的内容.
I'd like to be able to query parent entities and filter the contents of a child collection.
例如,我有一个OrderHeaders集合.我想使用LINQ查询此集合以返回所有OrderHeaders,但我只希望包含一些相关的OrderDetail行.
For example, I have a collection of OrderHeaders. I want to query this collection using LINQ to return all OrderHeaders, but I only want some of the related OrderDetail rows to be included.
我最好是在寻找一种解决方案,使我可以在一个LINQ语句中完成所有这些工作.
I am preferably looking for a solution where I can do all of this in a single LINQ statement.
以下控制台应用程序对此进行了演示.
The following console app demonstrates this.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LINQ
{
class Program
{
static void Main(string[] args)
{
List<OrderHeader> 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<OrderHeader> GetOrderHeaders()
{
List<OrderHeader> orders = new List<OrderHeader>();
OrderHeader header =
new OrderHeader {
AccountCode = "CUST1",
Detail = new List<OrderDetail>()};
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<OrderDetail>()
};
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<OrderDetail> Detail {get; set;}
}
public class OrderDetail
{
public string StockCode { get; set; }
public int Quantity { get; set; }
}
}
在此先感谢您的任何建议.
Many thanks in advance for any suggestions.
保罗
推荐答案
尝试以下操作:
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();
}
这篇关于LINQ-过滤子集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文