【问题标题】:How can I create a dynamic LINQ query in C# with possible multiple group by clauses?如何在 C# 中使用可能的多个 group by 子句创建动态 LINQ 查询?
【发布时间】:2011-02-23 08:37:21
【问题描述】:

我已经做了几年程序员,但我是一个
LINQ 和 C# 的新手,如果我的问题听起来不错,请原谅我
特别笨。

希望有人能指点我一下
方向。我的任务是想出形成一个
使用 C# 脚本中的动态多组 linq 查询
一个通用列表作为来源。

例如,假设我有一个包含多个项目的列表,其中包含以下内容
结构:

FieldChar1 - character
FieldChar2 - character
FieldChar3 - character
FieldNum1 - numeric
FieldNum2 - numeric

简而言之,我希望能够创建一个 LINQ 查询
将 FieldNum1 和 FieldNum2 按任何一个、两个或
分组求和 所有三个 FieldChar 字段将在
运行时间取决于用户的要求以及在同一查询中选择 FieldChar 字段。

我的项目中有包含 GroupByMany 扩展方法的 dynamic.cs,但我不得不承认我真的不确定如何使用这些方法。如果我使用带有硬连线 group by 请求但不是动态的查询,我能够获得所需的结果。

对任何错误的命名表示歉意,我是这种语言的新手,但欢迎任何建议。

非常感谢

亚历克斯

【问题讨论】:

    标签: c# .net linq group-by linq-to-objects


    【解决方案1】:

    这是基本的GroupBy 示例。假设我们有一个像这样的简单类:

    public class Person
    {
        public string Name { get; set; }
    
        public int Age { get; set; }
    
        public char Sex { get; set; }
    }
    

    然后,您可以像这样使用GroupBy

    var people = new List<Person> {
        new Person { Name = "Joe", Age = 30, Sex = 'M' },
        new Person { Name = "Liz", Age = 22, Sex = 'F' },
        new Person { Name = "Jim", Age = 22, Sex = 'M' },
        new Person { Name = "Alice", Age = 30, Sex = 'F' },
        new Person { Name = "Jenny", Age = 22, Sex = 'F' }
    };
    var groups = people.GroupBy(p => p.Age);
    
    foreach (var group in groups)
    {
        foreach (var person in group)
            Console.WriteLine(person.Name + " - " + person.Age);
    }
    

    至于按多个属性分组,请参见:
    http://weblogs.asp.net/zeeshanhirani/archive/2008/05/07/group-by-multiple-columns-in-linq-to-sql.aspx
    LINQ TO DataSet: Multiple group by on a data table

    基本上和匿名类型的语法是一样的,例如:

    var groups = people.GroupBy(p => new { p.Age, p.Sex });
    

    请注意,您可能正在寻找使用多个OrderBys:

    var query = people.OrderBy(p => p.Age).ThenBy(p => p.Sex);
    //You can have unlimited ThenBy's
    

    还要注意最后一个 GroupBy 语句的结果和这个 OrderBy 语句的结果是不一样的。

    【讨论】:

    • 非常感谢您的回复。我很感激它,并给了我一些新的东西。但是有没有可能得到你的例子...... var groups = people.GroupBy(p => new { p.Age, p.Sex });放入一行代码,其中 group by 子句 (p.Age, p.Sex) 可以被预先构建的变量字符串替换,该字符串可以是 Age 和/或 Sex 的任意组合?我来自 FoxPro/SQL 背景,您可以在其中使用字符串连接动态构建查询。再次感谢您的帮助。
    • @FordPerfect141 - 使用 LINQ,您实际上不能仅仅连接字符串,因为 LINQ 需要强类型。您可以通过动态创建这样的表达式来实现类似的效果。
    • 啊哈。因此,在您的示例中,如果用户有时想按性别和年龄分组,有时只是按年龄分组,您将如何在不实际对 group by 子句进行硬编码的情况下进行分组?我再次道歉,这对我来说是全新的。再次感谢。
    【解决方案2】:

    GroupBy(groupByName + " " + groupByDirection, new {})

    所以你可以传入 groupByName 和 groupByDirection,当你单步执行时,你可能会看到类似

    GroupBy("lastName desc", new{})

    GroupBy("firstName asc", new{})

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多