C#Predicate Builder with" NOT IN"功能

时间:2011-08-23 05:17:58

标签: c# predicatebuilder

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

例如,我有一个ID列表,我想选择其ID匹配或与ID不匹配的所有人。

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

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不在personID列表中的人。

4 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:3)

您使用实体框架吗?

然后您可以在不使用PredicateBuilder的情况下构建查询:

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

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

答案 2 :(得分:0)

这是你想要的吗?

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

答案 3 :(得分:0)

不看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);