2011-06-13 7 views
6

Suponga que tiene los siguientes objetos simples:LINQ - SelectMany de varias propiedades en un mismo objeto

class Order 
{ 
    public Customer[] Customers { get; set; } 
} 

class Customer 
{ 
    public SaleLine[] SaleLines { get; set; } 
} 

class SaleLine 
{ 
    public Tax[] MerchTax { get; set; } 
    public Tax[] ShipTax { get; set; } 
} 

class Tax 
{ 
    public decimal Rate { get; set; } 
    public decimal Total { get; set; } 
} 

Con estos objetos, quiero ser capaz de obtener una lista de todos los tipos impositivos únicos utilizados en la totalidad orden, incluidas las tasas de impuestos de mercadería y envío.

La siguiente consulta LINQ me va a obtener la lista de lo que necesito, pero sólo para los impuestos de mercancías:

  var TaxRates = MyOrder.Customers 
      .SelectMany(customer => customer.SaleLines) 
      .SelectMany(saleline => saleline.MerchTax) 
      .GroupBy(tax => tax.Rate) 
      .Select(tax => tax.First().Rate 

¿Cómo puedo obtener una lista que contiene la lista de los tipos impositivos única que contiene ambos tipos de mercancías y de envío?

Respuesta

11

Parece que usted quiere esto:

var TaxRates = MyOrder.Customers 
      .SelectMany(customer => customer.SaleLines) 
      .SelectMany(saleline => saleline.MerchTax.Concat(saleline.ShipTax)) 
      .GroupBy(tax => tax.Rate) 
      .Select(group => group.Key); 

Básicamente el cambio es la llamada a Concat que concatenar dos secuencias juntos.

+0

Puede cambiar la última proyección 'Seleccionar' a' Seleccionar (impuestos => tax.Key) '. – jason

+0

@Jason: cierto. Editaré –

+0

Pregunta de seguimiento, y puedo agregar esto en una nueva pregunta si es necesario. Ambos tipos de impuestos pueden ser nulos. ¿Qué hago cuando el impuesto de merchandising tiene un valor, pero el impuesto de envío es nulo? Puedo agregar una cláusula .where antes de seleccionar muchos, pero el concat aún intentaría combinar ambos. – AaronS

Cuestiones relacionadas