C# LINQ-从同一对象的多个属性中选择Many

C# LINQ-从同一对象的多个属性中选择Many,c#,linq,C#,Linq,假设您有以下简单对象: 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

假设您有以下简单对象:

 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

如何获取包含商品和运费的唯一税率列表?

听起来您想要的是:

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

基本上,更改是调用
Concat
,它将两个序列连接在一起。

您可以将最后一个
Select
投影更改为
Select(tax=>tax.Key)
。后续问题,如果需要,我可以将其添加到新问题中。两种税类型都可以为空。当merch tax有值,但ship tax为空时,我该怎么办?我可以在select many之前添加一个.where子句,但是concat仍然会尝试将两者都concat。@AaronS:如果这在LINQ to对象中,我可能会编写自己的
NullToEmpty
扩展方法,该方法返回现有值或空数组(如果需要)。或者,只需确保数组从不为null,而是确保它们是空数组。老实说,这通常是个好主意。