如何在 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
使用_ => x => 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干货盘点#
NET问答: 如何在 dynamic 集合上使用 Linq ?