具有嵌套组的动态linq查询

时间:2015-10-12 09:11:54

标签: c# linq hierarchy linq-group

我尝试使用动态查询创建嵌套组。

以下是我的数据集

var invoices = new List < Purchase > () {
    new Purchase() {
        Id = 1, Customer = "a", Date = DateTime.Parse("1/1/2009")
    }, new Purchase() {
        Id = 2, Customer = "a", Date = DateTime.Parse("1/2/2009")
    }, new Purchase() {
        Id = 3, Customer = "a", Date = DateTime.Parse("1/2/2009")
    }, new Purchase() {
        Id = 4, Customer = "b", Date = DateTime.Parse("1/1/2009")
    }, new Purchase() {
        Id = 5, Customer = "b", Date = DateTime.Parse("1/1/2009")
    }, new Purchase() {
        Id = 6, Customer = "b", Date = DateTime.Parse("1/2/2009")
    }
 };

此linq查询返回所需的结果。

  var tree = invoices.GroupBy(x => x.Date).Select(x => new
        {
            Key = x.Key,
            Items = x.GroupBy(y => y.Customer).Select(y => new
            {
                Key = y.Key,
                Items = y
            })
        }).ToList();

以下是上述linq查询的输出

Output of linq query result

但我只需要按不同的顺序对不同的列进行分组。

因此我尝试创建动态linq查询。但我的代码阻止结果与我以前的linq查询不一样。

var groupedInvoiceItems = invoices.AsQueryable().GroupBy("new (Date, Customer)", "it");

1 个答案:

答案 0 :(得分:0)

您可以使用Generics执行此操作。只需将您的Lambda传递给通用方法即可。

类似的东西:

private IEnumerable<PurchaseGrp> BuildList<TSource>(IQueryable<TSource> allRecords,
            Func<TSource, string> selector)
{
   var result = allRecords.GroupBy(x = > x.selector(x));
   return result;
}

返回类型可以是新的分组类型PurchaseGrp,也可以与您的来源(Purchase)相同。