C#谓词构建器带有“NOT IN”功能

7

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

例如,我有一个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列表中的人。


作为一种解决方法,我设法获取了预先过滤的PersonIDs列表,因此我可以只使用上面的代码。这不是理想的,但它能够工作。 - Craig G.
4个回答

3

您是否使用Entity Framework?

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

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

通过这个LINQ语句创建了一个SQL的NOT IN查询。


3

请向德摩根提问:

非(P 或 Q)= (非 P)且 (非 Q)

为了让你的代码生成等效于 NOT IN 条件,可以重写为

var predicate = PredicateBuilder.True<Person>()

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

这是我第一次尝试的方法,但是从SQL中获取到了一个空结果集。当我使用Profiler检查SQL时,我得到了类似以下的内容: SELECT CAST(NULL as varchar(1)) as [C1], . . . FROM (SELECT 1 as X) AS [SingleRowTable1] WHERE 1=0 - Craig G.

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接