6

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

4

4 回答 4

3

你使用实体框架吗?

然后您可以在没有 PredicateBuilder 的情况下构建查询:

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

从此 LINQ 语句创建 SQL NOT IN 查询。

于 2012-07-23T08:48:36.127 回答
3

德摩根

非(P 或 Q)=(非 P)与(非 Q)

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

var predicate = PredicateBuilder.True<Person>()

predicate = predicate.And(e=>e.PersonID != temp);
于 2011-08-23T05:25:39.960 回答
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);
于 2011-08-23T05:26:28.307 回答
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);
于 2011-08-23T05:30:40.733 回答