【问题标题】:Building up a GroupBy Lambda expression with multiple params使用多个参数构建 GroupBy Lambda 表达式
【发布时间】:2018-04-06 09:52:24
【问题描述】:

我有以下枚举扩展方法:

public static Expression<Func<Table, object>> GetGroupByClause(this OntDubbelingsEigenschappen o)
{
    switch (o)
    {
        case OntDubbelingsEigenschappen.Voornaam:
            return w => w.TableField1;
        case OntDubbelingsEigenschappen.Achternaam:
            return w => w.TableField2;
        case OntDubbelingsEigenschappen.Emailadres:
            return w => w.TableField3;
        case OntDubbelingsEigenschappen.GeboorteDatum:
            return w => w.TableField4;
        default:
            return null;
    }
}

现在我想使用这个扩展来创建以下查询:

List<Expression<Func<Table, object>>> delList = new List<Expression<Func<Table, object>>>();
ontdubbelEigenschapIds.ForEach(f => delList.Add(f.GetGroupByClause()));            
var users = Db.Table.GroupBy(x => new { delList })
            .SelectMany(s => s).ToList().Select(s => 
            new Model(s, isOverTakeActive)).ToList();

这不起作用,因为我在查询中传递了一个非原始类型。我怎样才能以正确的方式做到这一点?

【问题讨论】:

  • GroupByQueryableEnumerable 版本)有一个TKey 通用参数。您似乎想在运行时决定此通用参数的类型,但这是不可能的(除非您生成代码)。
  • 不是一个完整的答案,但我对多个OrderBys 做了类似的事情。基本上,您需要的是表达式和​​反射的组合,以根据字段/属性获得适当的重载。也许这有帮助:OrderBy based on list of fields and Asc / Desc rules
  • 如果这是用于为 EF 生成动态分组查询...看看动态 linq ...github.com/StefH/System.Linq.Dynamic.Core

标签: c# lambda linq-expressions


【解决方案1】:

Mitsu Furuta 有一个很好的解决方案...

https://blogs.msdn.microsoft.com/mitsu/2007/12/21/playing-with-linq-grouping-groupbymany/

虽然它不会产生扁平化的分组...

如果你想展平生成的树,你想查看的组是树的叶子......尖叫着用 yield return 进行一点递归

【讨论】:

  • 虽然这种使用多个分组的想法可能是解决问题的一种方法,但这仅适用于“客户端”。虽然从这个问题来看并不明显,但我的猜测是应该在“服务器端”使用IQueryable&lt;T&gt; 而不是IEnumerable&lt;T&gt; 执行分组。这是基于ToListSelectMany 之后但在Select 之前的出现。当然,我可能错了。
  • 没错。属性的数量也是动态的,所以我不想直接粘贴属性名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多