[英]Linq PredicateBuilder With Complex AND & OR
Using PredicateBuilder and make a predicate on many ID from a table , we have result of many list with filterd ID like this: 使用PredicateBuilder并根据表中的许多ID做谓词,我们得到许多具有过滤ID的列表,如下所示:
predicate builder make a predicate with OR for {aaa,bbb,ccc,ddd} . 谓词构建器使用{aaa,bbb,ccc,ddd}的OR构成谓词。 i want to have first item of each group.
我想每个小组都有第一项。 is it possible with linq query ?
LINQ查询有可能吗?
var predicate = PredicateBuilder.False<someobject>();
foreach (var item in items)
{
predicate = predicate.Or(p => p.id == item.id );
}
... ...
Unless this is part of a bigger query requiring predicate builder, this simple LINQ
should work: 除非这是需要谓词生成器的较大查询的一部分,否则此简单的
LINQ
应该起作用:
var result = items.GroupBy(x => x.Id)
.Select(x => x.First());
Or if you want to order the elements first, then choose the first from each group: 或者,如果要先排序元素,则从每个组中选择第一个:
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());
If you want to build a predicate based on you rule (to get a first item from a group), you need to build a predicate based on this rule: 如果要基于规则构建谓词(从组中获取第一项),则需要基于此规则构建谓词:
Example class: 示例类:
public class Person
{
public int Id { get; set; } //example: "aaa"
public string Name { get; set; } //example: 1
}
Query: 查询:
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();
As a result it will build a predicate like this (for data you have provided): 结果,它将构建这样的谓词(对于您提供的数据):
p => p.Id == 1 || p.Id == 10 || p.Id == 15 || p.Id == 17
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.