如何在 Dynamic Linq Core 中无任何分组

Posted

技术标签:

【中文标题】如何在 Dynamic Linq Core 中无任何分组【英文标题】:How to GroupBy nothing in Dynamic Linq Core 【发布时间】:2021-07-23 10:28:42 【问题描述】:

我正在创建一些动态 linq 语句供用户决定分组依据。但是,当用户什么都不输入时,我希望查询按“无”分组,就像只输出查询结果,就好像没有 groupby 一样。类似于此答案here,但使用的是 Dynamic Linq Core。

var query = db.II_POLICY_AND_COVERAGE
                    .Where(x => (x.date>= settings.StartDate && x.date<= settings.EndDate))
                    .GroupBy(user_groupby_input_string);

                if (user_defined_calc_method.Equals("Total"))
                
                    query = query.Select("new(Key as name, Sum(money_column) as value)");
                
                else if (user_defined_calc_method.Equals("Count"))
                
                    query = query.Select("new(Key as name, Count() as value)");
                

例如,如果user_groupby_input_string"gender",则查询将按性别列分组。如果user_groupby_input_string"" 或null,则查询将忽略groupby 行,只对整个数据集进行求和或计数。

【问题讨论】:

按常量分组,例如 1。 @SvyatoslavDanyliv 忍不住笑我昨天拉扯了整个头发,这一切都通过您提供的如此简单的解决方案解决了。谢谢。 【参考方案1】:

当您按常量分组时,LINQ Translator 会专门处理这种情况,例如1。 LINQ Translator 将删除分组并使用聚合函数生成简单的普通 SQL。

【讨论】:

【参考方案2】:

我看起来不正确,您正在使用它 EF,如果不进行修改,这可能会或可能不会工作。

你可以尝试自己做:

第 1 步。创建“动态”石斑鱼。

class X

    public string A  get; set; 
    public int B  get; set; 

    public static Func<X, object> GetGroupBy(string name)
        => name?.ToLower() switch
        

            "a" => x => x.A,
            "b" => x => x.B,
            _ => x => 1 // or x.GetHashCode() if used for objects in memory
        ;

    // public override int GetHashCode() => HashCode.Combine(A, B);

第 2 步。使用它

var groups = .GroupBy(X.GetGroupBy(query))

第 3 步。测试

var arr = new[]  new X  A = "x", B = 1 , new X  A = "x", B = 2 , new X  A = "", B = 1 , new X  A = "", B = 3  ;

foreach (var query in new[] "a", "B", "", null, "7" )

    var queryStr = query != null ? $"'query'" : "null";
    Console.WriteLine($"Query: queryStr");
    var groups = arr.GroupBy(X.GetGroupBy(query));

    foreach (var g in groups)
    
        var elements = string.Join(",", g.Select(x => $"'x.A':x.B"));
        Console.WriteLine($"\tGroup: 'g.Key'\tElements: elements");
    

Query: 'a'
    Group: 'x'  Elements: 'x':1,'x':2
    Group: ''   Elements: '':1,'':3
Query: 'B'
    Group: '1'  Elements: 'x':1,'':1
    Group: '2'  Elements: 'x':2
    Group: '3'  Elements: '':3
Query: ''
    Group: '1'  Elements: 'x':1,'x':2,'':1,'':3
Query: null
    Group: '1'  Elements: 'x':1,'x':2,'':1,'':3
Query: '7'
    Group: '1'  Elements: 'x':1,'x':2,'':1,'':3

使用_ =&gt; x =&gt; x.GetHashCode(),这将是:

Query: 'a'
    Group: 'x'  Elements: 'x':1,'x':2
    Group: ''   Elements: '':1,'':3
Query: 'B'
    Group: '1'  Elements: 'x':1,'':1
    Group: '2'  Elements: 'x':2
    Group: '3'  Elements: '':3
Query: ''
    Group: '94073102'   Elements: 'x':1
    Group: '142666244'  Elements: 'x':2
    Group: '186235014'  Elements: '':1
    Group: '-46300365'  Elements: '':3
Query: null
    Group: '94073102'   Elements: 'x':1
    Group: '142666244'  Elements: 'x':2
    Group: '186235014'  Elements: '':1
    Group: '-46300365'  Elements: '':3
Query: '7'
    Group: '94073102'   Elements: 'x':1
    Group: '142666244'  Elements: 'x':2
    Group: '186235014'  Elements: '':1
    Group: '-46300365'  Elements: '':3

【讨论】:

这不适用于 LINQ to 数据库,因为这需要 Expression

以上是关于如何在 Dynamic Linq Core 中无任何分组的主要内容,如果未能解决你的问题,请参考以下文章

System.Linq.Dynamic.Core - 查询嵌套对象

使用Dynamic LINQ创建高级查询服务 #yyds干货盘点#

什么都2020了,LINQ查询你还在用表达式树

NET问答: 如何在 dynamic 集合上使用 Linq ?

如何使用 System.Linq.Dynamic 检查 JSON 对象是不是与谓词匹配

如何使用 Dynamic Linq 进行左外连接?