如何用LINQ或Entity Framework筛选含指定列值的全组数据?
可以通过LINQ/Entity Framework实现该需求
原数据表
| 列A | 列B |
|---|---|
| Peter | Apple |
| Peter | Orange |
| Peter | Melon |
| John | Apple |
| John | Potato |
| John | Melon |
| Suzane | Kiwi |
| Suzane | Cucumber |
| Suzane | Orange |
预期结果
| 列A | 列B |
|---|---|
| Peter | Apple |
| Peter | Orange |
| Peter | Melon |
| Suzane | Kiwi |
| Suzane | Cucumber |
| Suzane | Orange |
实现方案
假设你的实体类定义为Item,包含ColumnA(对应列A)和ColumnB(对应列B)属性,数据库上下文的DbSet为dbContext.Items,以下是两种可行的实现方式:
方法1:分步查询(先筛选目标列A集合,再关联查询)
// 1. 提取所有列B为"Orange"的列A值,去重后得到目标集合 var targetColumnAs = dbContext.Items .Where(i => i.ColumnB == "Orange") .Select(i => i.ColumnA) .Distinct() .ToList(); // 2. 查询所有列A属于目标集合的完整行数据 var result = dbContext.Items .Where(i => targetColumnAs.Contains(i.ColumnA)) .ToList();
方法2:子查询(单语句紧凑写法)
利用Any方法嵌套子查询,EF会自动将其转换为高效的SQL EXISTS语句:
var result = dbContext.Items .Where(i => dbContext.Items .Any(subI => subI.ColumnA == i.ColumnA && subI.ColumnB == "Orange")) .ToList();
这种写法直接判断当前行的ColumnA是否存在对应的ColumnB为"Orange"的记录,逻辑更直观,也无需额外的中间集合存储。
内容的提问来源于stack exchange,提问作者user1913907
相关产品推荐
相关产品推荐

