[英]Linq PredicateBuilder With Complex AND & OR
使用PredicateBuilder並根據表中的許多ID做謂詞,我們得到許多具有過濾ID的列表,如下所示:
謂詞構建器使用{aaa,bbb,ccc,ddd}的OR構成謂詞。 我想每個小組都有第一項。 LINQ查詢有可能嗎?
var predicate = PredicateBuilder.False<someobject>();
foreach (var item in items)
{
predicate = predicate.Or(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.