【问题标题】:LINQ: Build dynamic filter with sequence of ANDsLINQ:使用 AND 序列构建动态过滤器
【发布时间】:2012-07-07 01:00:56
【问题描述】:

我正在努力动态创建这样的查询:

Dictionary<string, Guid> parms = new Dictionary<string, Guid>();

foreach (var kvp in parms)
{
    var exp = ReportDefinitions.Where(x=> 
        x.Discriminants.Any(y=> y.Key == kvp.Key && y.Value == kvp.Value)
// && more conditions to add here at each cycle
        );  
}

其中 ReportDefinitions.Discriminants 是 IDictionary&lt;string, Guid&gt;; 我知道如何构建简单的表达式,但我不知道如何构建这个“任何”似乎真的很复杂。 Any call 很难理解

有人知道怎么处理吗?

【问题讨论】:

    标签: c# .net linq linq-expressions


    【解决方案1】:
    var query = parms.Aggregate(ReportDefinitions.AsQueryable(),
      (a, kvp) => a.Where(x => x.Discriminants.Any(
         y => y.Key == kvp.Key && y.Value == kvp.Value)));
    

    我们从 ReportDefinitions 的未过滤查询开始,并折叠所有查询参数。最终结果是一个嵌套过滤器序列,相当于一个 AND 序列。

    关键的见解是这个过程很好地映射到函数式语言中已知的reduce。 LINQ to objects 通过Aggregate 支持它。

    【讨论】:

    • 我想立即感谢您,似乎是一个简单的解决方案。我实际上来自移动设备,我会在几个小时内尝试您的解决方案。
    • 效果很好,底层的表达式几乎和我用大量表达式构建的一样。再次感谢,我刚刚学到了一些新东西
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多