具有复杂AND& amp;的Linq PredicateBuilder要么

时间:2014-04-20 03:49:09

标签: c# linq predicate predicatebuilder

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

enter image description here

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

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

...

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

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

示例类:

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