使用 LinqKit 来解决 EFCore 多字段/多列 Where In 的问题

一般单个列的 WHERE IN 可以用 .Contains() 来解决,例如

var posts = await context.Set<Post>().Where(x => postIds.Contains(x.Id)).ToListAsync();

但如果需要同时根据多个列进行匹配,例如传入的是一个 Tuple 数组,就不能用这种办法了。

如果数量固定,我们可以通过很多个条件语句拼接来模拟,例如

var posts = await context.Set<Post>().Where(x => (x.Author == "星繁" && x.Tag == "C#") || (x.Author == "dudu" && x.Tag == "dotnet")).ToListAsync();

但显然传入的参数通常是一个变量,因此我们可以使用 LinqKit 来动态的生成和拼接 || 语句。

首先通过 NuGet 安装包 LinqKit.Microsoft.EntityFrameworkCore,然后通过如下方式进行拼接并直接传入 Where 里面就可以了:

var predicate = PredicateBuilder.New<Post>();
foreach (var tuple in tuples)
{
    predicate = predicate.Or(x => x.Author == tuple.Author && x.Tag == tuple.Tag);
}

var posts = await context.Set<Post>().Where(predicate).ToListAsync();

需要注意 tuple 数量不能太多,否则容易超出 SQL 语句长度限制。

posted @ 2026-01-12 16:52  沈星繁  阅读(7)  评论(0)    收藏  举报