简体   繁体   English

在Linq中通过查询创建动态组

[英]Create a dynamic group by Query in Linq

I have a form with 4 checkbox for grouping , when I want to create LINQ dynamic query in where clause, it is very easy to use something like this : 我有一个带有4复选框的表格用于分组,当我想在where子句中创建LINQ动态查询时,使用这样的东西非常容易:

  query = query.where(x=>x.blah == blahblah).asQueryable();

but I can't simulate this type of coding for Group by clause. 但是我无法为Group by子句模拟这种类型的编码。 I need something like this : 我需要这样的东西:

if(blah1==true)
    query = query.GroupBy(x=>x.Blah1).select(smthing);
if(blah2==true)
    query = query.GroupBy(x=>x.Blah2).select(smthing);
if(blah3==true)
    query = query.GroupBy(x=>x.Blah3).select(smthing);
 ....

How can I do this kind of query? 我该如何查询? some post in stackoverflow show misunderstanding code like Expression> . stackoverflow中的某些帖子显示了误解代码,例如Expression>。 Please show me an easy and applicable way. 请给展示一种简单且适用的方法。

May be this is not the correct way of doing things, but using reflection does thing. 可能这不是正确的做事方式,但是使用反射可以做事。 Hence, all you need is to determine property name and pass it to GroupBy . 因此,您所需GroupBy就是确定属性名称并将其传递给GroupBy

class Person
{
    public string Name { get; set; }
    public int Wage { get; set; }
    public int Age { get; set; }
    public override string ToString() =>
        $"Name: {Name}, Wage: {Wage}, Age: {Age}";
}

var list = new List<Person>
{
    new Person { Name = "Name1", Wage = 1, Age = 1},
    new Person { Name = "Name1", Wage = 2, Age = 2},
    new Person { Name = "Name2", Wage = 2, Age = 2},
    new Person { Name = "Name3", Wage = 2, Age = 2},
    new Person { Name = "Name3", Wage = 2, Age = 2},
    new Person { Name = "Name4", Wage = 2, Age = 2},
    new Person { Name = "Name4", Wage = 2, Age = 2}
};

var x = list.GroupBy(p => p.GetType().GetProperty("Name").GetValue(p));

foreach(var z in x)
{
    WriteLine(z.Key);
    foreach(var p in z)
    {
        WriteLine("\t" + p);
    }
}

/*
    Output:

Name1
      Name: Name1, Wage: 1, Age: 1
      Name: Name1, Wage: 2, Age: 2
Name2
      Name: Name2, Wage: 2, Age: 2
Name3
      Name: Name3, Wage: 2, Age: 2
      Name: Name3, Wage: 2, Age: 2
Name4
      Name: Name4, Wage: 2, Age: 2
      Name: Name4, Wage: 2, Age: 2
*/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM