【问题标题】:Linq PredicateBuilder With Complex AND & OR具有复杂 AND & OR 的 Linq PredicateBuilder
【发布时间】:2014-04-20 03:49:08
【问题描述】:

使用 PredicateBuilder 并对表中的多个 ID 进行谓词,我们会得到许多带有过滤 ID 的列表的结果,如下所示:

谓词生成器使用 OR 为 {aaa,bbb,ccc,ddd} 创建一个谓词。我想拥有每组的第一项。 linq 查询可以吗?

 var predicate = PredicateBuilder.False<someobject>();
        foreach (var item in items)
        {
            predicate = predicate.Or(p => p.id == item.id );
        }

...

【问题讨论】:

  • 任何答案有帮助吗?
  • 还没有!我想要每个组的第一项

标签: c# linq predicate predicatebuilder


【解决方案1】:

除非这是需要谓词构建器的更大查询的一部分,否则这个简单的LINQ 应该可以工作:

var result = items.GroupBy(x => x.Id)
                  .Select(x => x.First());

或者,如果您想先对元素进行排序,则从每个组中选择第一个:

var result = items.OrderBy(x => x.Id)
                  .ThenBy(x => x.Quantity)  // not sure what 2nd column is called
                  .GroupBy(x => x.Id)
                  .Select(x => x.First());

【讨论】:

  • 谓词呢?
【解决方案2】:

如果您想根据您的规则构建谓词(从组中获取第一项),您需要根据此规则构建谓词:

示例类:

public class Person
{
    public int Id { get; set; }      //example: "aaa"
    public string Name { get; set; }    //example: 1
}

查询:

var predicate2 = PredicateBuilder.False<Person>();

foreach (var item in items.GroupBy(x => x.Name).SelectMany(x => x.OrderBy(y => y.Id).Take(1)))
{
    predicate2 = predicate2.Or(p => p.Id == item.Id);
}

var fnc2 = predicate2.Compile();
var filtered2 = allItems.Where(fnc2).ToList();

因此它将构建一个这样的谓词(对于您提供的数据):

p => p.Id == 1 || p.Id == 10 || p.Id == 15 || p.Id == 17

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2015-09-16
    • 2011-06-19
    相关资源
    最近更新 更多