簡體   English   中英

具有復雜AND&OR的Linq PredicateBuilder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM