如何用LINQ查询仅关联单个Perimeter的Image?
筛选仅关联唯一Perimeter的Image(LINQ实现)
原始数据
| Image | Perimeter |
|---|---|
| a | 1 |
| b | 1 |
| b | 2 |
| d | 3 |
| e | 1 |
需求说明
需要从上述表中筛选出仅关联唯一Perimeter值的Image,预期结果为 a、d、e(b因关联了1和2两个Perimeter,不符合条件)。
业务目的:删除某个Perimeter时,可移除仅关联该Perimeter的Image;若Image关联多个Perimeter则不能移除。
原SQL查询思路
用户提供的SQL存在语法错误,修正后的核心逻辑SQL如下:
SELECT "Image" FROM 你的表名 WHERE "Image" IN ( SELECT "Image" FROM 你的表名 GROUP BY "Image" HAVING COUNT(DISTINCT "Perimeter") = 1 )
核心逻辑:先分组统计每个Image关联的Perimeter数量,筛选出数量为1的Image。
LINQ实现方案
1. LINQ to Objects(内存集合操作)
假设数据集合是List<ImagePerimeter>,其中ImagePerimeter类包含Image和Perimeter属性:
var result = imagePerimeterList .GroupBy(ip => ip.Image) .Where(g => g.Select(ip => ip.Perimeter).Distinct().Count() == 1) .Select(g => g.Key) .ToList();
若表中无重复的Image+Perimeter记录,可简化为:
var result = imagePerimeterList .GroupBy(ip => ip.Image) .Where(g => g.Count() == 1) .Select(g => g.Key) .ToList();
2. LINQ to Entities(Entity Framework场景)
使用EF查询数据库时,写法类似,EF会自动转换为对应SQL:
var result = dbContext.ImagePerimeters .GroupBy(ip => ip.Image) .Where(g => g.Select(ip => ip.Perimeter).Distinct().Count() == 1) .Select(g => g.Key) .ToList();
同样,若无重复的Image+Perimeter记录,可简化为:
var result = dbContext.ImagePerimeters .GroupBy(ip => ip.Image) .Where(g => g.Count() == 1) .Select(g => g.Key) .ToList();
内容的提问来源于stack exchange,提问作者Lucas Zanon
相关产品推荐
相关产品推荐

