Me gustaría poder consultar las entidades padre y filtrar el contenido de una colección secundaria.LINQ - filtrar colección infantil
Por ejemplo, tengo una colección de OrderHeaders. Deseo consultar esta colección usando LINQ para devolver todos los OrderHeaders, pero solo quiero que se incluyan algunas de las filas de OrderDetail relacionadas.
Estoy buscando una solución en la que pueda hacer todo esto en una sola declaración LINQ.
La siguiente aplicación de consola lo demuestra.
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; }
}
}
Muchas gracias de antemano por cualquier sugerencia.
Paul
Por qué la obsesión por una sola declaración de LINQ? –
Debería dar más antecedentes a esta pregunta. De hecho, estoy usando LINQ to Entity Framework donde estoy generando la declaración LINQ utilizando Dynamic Expression API (como resultado de que el usuario construya un criterio de búsqueda con una IU). Debido a esto, preferiría hacerlo en una declaración LINQ. – P2l