如何使用EF Core实现多列匹配的数据库行查询?
可以通过EF Core直接实现该查询,无需全表拉取后筛选
实现步骤:
定义对应实体类
先为数据库表A和匹配列表的对象创建实体类:// 对应数据库表A的实体 public class TableA { public string AAA { get; set; } public string BBB { get; set; } public int CCC { get; set; } public int DDD { get; set; } } // 对应匹配列表的对象类 public class MatchItem { public string Prop1 { get; set; } public string Prop2 { get; set; } }编写EF Core查询代码
利用EF Core的多列Contains特性(EF Core 2.1+支持),直接在数据库端完成筛选:// 构造你的匹配对象列表 var matchList = new List<MatchItem> { new MatchItem { Prop1 = "Rob", Prop2 = "Cat" }, new MatchItem { Prop1 = "Tom", Prop2 = "Fly" }, new MatchItem { Prop1 = "Tom", Prop2 = "Rat" }, new MatchItem { Prop1 = "Jon", Prop2 = "Dog" } }; // 构建查询 var query = dbContext.TableA .Where(a => matchList.Contains(new { AAA = a.AAA, BBB = a.BBB })); // 执行查询,获取结果 var result = await query.ToListAsync();
原理说明:
EF Core会将上述代码转换为SQL的多列IN子句,示例生成的SQL类似:
SELECT [a].[AAA], [a].[BBB], [a].[CCC], [a].[DDD] FROM [TableA] AS [a] WHERE ([a].[AAA], [a].[BBB]) IN ( ('Rob', 'Cat'), ('Tom', 'Fly'), ('Tom', 'Rat'), ('Jon', 'Dog') )
这个查询会直接在数据库端完成过滤,不会将表A的全量数据加载到内存后再筛选,性能更优。
版本注意:
如果使用EF Core 2.1以下版本,多列Contains特性不支持,可通过手动拼接OR条件或使用Join方式实现,但推荐升级到更高版本的EF Core以简化代码。
内容的提问来源于stack exchange,提问作者Rob White
相关产品推荐
相关产品推荐

