2011-06-13 71 views
6

假設你有下面的簡單對象:LINQ - 從同一個對象多個屬性的SelectMany

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; } 
} 

與這些對象,我希望能夠得到所有的整個使用的唯一稅率列表包括商品和運輸稅率。

下面的LINQ查詢會得到我的名單,我需要,但僅限於商品稅:

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

我怎樣才能得到一個包含同時包含商品和運費獨特的稅率表清單?

回答

11

這聽起來像你想的:

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

基本上的改變是調用Concat將連接兩個序列在​​一起。

+0

您可以將最後一個「選擇」投影更改爲「選擇(稅收=> tax.Key)」。 – jason 2011-06-13 15:18:56

+0

@Jason:的確如此。將編輯。 – 2011-06-13 15:20:47

+0

後續問題,如果需要,我可以在新問題中添加此問題。兩種稅種都可以爲空。當食品有價值時,我應該怎麼做,但是船舶稅是空的?我可以在選擇多個之前添加.where子句,但是concat仍然會嘗試連接兩者。 – AaronS 2011-06-13 15:44:12

相關問題