C# Linq PredicateBuilder,具有复杂和&;或

C# Linq PredicateBuilder,具有复杂和&;或,c#,linq,predicate,predicatebuilder,C#,Linq,Predicate,Predicatebuilder,使用PredicateBuilder并对表中的多个ID进行谓词,我们得到了具有filterd ID的多个列表的结果,如下所示: 谓词生成器使用或为{aaa,bbb,ccc,ddd}生成谓词。我想要每组的第一项。可以使用linq查询吗 var predicate = PredicateBuilder.False<someobject>(); foreach (var item in items) { predicate = p

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

谓词生成器使用或为{aaa,bbb,ccc,ddd}生成谓词。我想要每组的第一项。可以使用linq查询吗

 var predicate = PredicateBuilder.False<someobject>();
        foreach (var item in items)
        {
            predicate = predicate.Or(p => p.id == item.id );
        }
var predicate=PredicateBuilder.False();
foreach(项目中的var项目)
{
谓词=谓词。或(p=>p.id==item.id);
}

除非这是需要谓词生成器的更大查询的一部分,否则这个简单的
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());

如果要基于规则生成谓词(从组中获取第一项),则需要基于此规则生成谓词:

示例类:

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