微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Dynamic Linq Core 中不分组

如何解决如何在 Dynamic Linq Core 中不分组

我正在创建一些动态 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 行并仅对整个数据集进行求和或计数。

解决方法

这种情况是由 LINQ Translator 在 GroupBy by 常量时专门处理的,例如 1。 LINQ Translator 将删除分组并使用聚合函数制作简单的普通 SQL。

,

我看起来不正常,您正在使用它 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 = 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,'':3
Query: '7'
    Group: '1'  Elements: 'x':1,'':3

使用 _ => x => x.GetHashCode() 这将是:

Query: 'a'
    Group: 'x'  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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。