使用 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 语句长度限制。
浙公网安备 33010602011771号