如何在Entity Framework LINQ查询中实现T-SQL的CASE WHEN逻辑?
T-SQL转EF LINQ时CASE WHEN分组逻辑的正确实现
原T-SQL的核心逻辑是按a.Number分组后,统计每组中不同b.Id、c.Id的数量,再根据数量判断返回'MULTIPLE'或对应字段的最大值。你之前的LINQ错误在于没有做分组操作,且误用了Count()——你写的b.Test.Count()是计算字符串长度,而非分组后不同Id的数量,这才导致每次都返回'MULTIPLE'。
正确的LINQ查询写法
var results = await (from a in dbContext.table1 join b in dbContext.table2 on a.Id equals b.Id join c in dbContext.table3 on b.Id equals c.Id where a.Number == 150 // 按a.Number分组,将关联的b、c数据纳入分组 group new { b, c } by a.Number into grouped select new GetDataclass { Value1 = grouped.Key, // 统计分组中不同b.Id的数量,判断后返回对应值 Value2 = grouped.Select(x => x.b.Id).Distinct().Count() > 1 ? "MULTIPLE" : grouped.Max(x => x.b.Test), // 统计分组中不同c.Id的数量,判断后返回拼接姓名的最大值 Value3 = grouped.Select(x => x.c.Id).Distinct().Count() > 1 ? "MULTIPLE" : grouped.Max(x => x.c.FirstName + " " + x.c.LastName) }).ToListAsync();
关键说明
- 分组操作:必须通过
group ... by ... into完成分组,对应原T-SQL的GROUP BY a.Number - 统计distinct数量:用
Select(x => x.b.Id).Distinct().Count()对应原T-SQL的COUNT(DISTINCT b.Id) - 取最大值:用
grouped.Max(...)对应原T-SQL的MAX(...),确保分组后取字段的最大值
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

