带有"NOT IN"的c#谓词生成器功能

本文关键字:quot 功能 谓词 NOT IN 带有 | 更新日期: 2023-09-27 18:06:28

使用PredicateBuilder如何获得类似于SQL IN或NOT IN查询的功能?

例如,我有一个id列表,我想选择id匹配或不匹配的所有People。

人员匹配功能相当简单(尽管可能有更好的方法)

var predicate = PredicateBuilder.False<Person>()
foreach (int i in personIDs)
{
  int temp = i;
  predicate = predicate.Or(e=>e.PersonID == temp);
}
return persons.Where(predicate);

我怎么得到相反的呢?我想要id不在personIDs列表中的所有人员。

带有"NOT IN"的c#谓词生成器功能

Ask De Morgan:

NOT (p OR Q) = (NOT p) AND (NOT Q)

要让你的代码生成相当于NOT IN的条件,重写为

var predicate = PredicateBuilder.True<Person>()

predicate = predicate.And(e=>e.PersonID != temp);

你使用实体框架吗?

那么你可以不使用PredicateBuilder来构建查询:

var personIds = new List<int>() { 8,9,10 };
var query = persons.Where(it => !personIds.Contains(it.PersonId));

从这个LINQ语句创建一个SQL NOT IN查询

这是你想要的吗?

var predicate = PredicateBuilder.True<Person>()
foreach (int i in personIDs)
{
    int temp = i;
    predicate = predicate.And(e => e.PersonID != temp);
}
return persons.Where(predicate);

不用看api....

var predicate = PredicateBuilder.True<Person>()
foreach (int i in personIDs)
{
    int temp = i;
    predicate = predicate.And(e=>e.PersonID != temp);
}
return persons.Where(predicate);