请求协助将指定SQL查询转换为LINQ或Lambda表达式
没问题,我帮你把这个统计类的SQL转换成LINQ(包括Lambda表达式和查询语法两种写法),先理清楚你的需求:就是统计QualityOfService字段里各个评级(Excellent、VeryGood、Good、Bad等)的数量,同时返回固定的分类名称'Quality Of Service'对吧?
Lambda表达式写法
假设你的实体类是YourEntity,对应的数据库上下文集合是dbContext.YourEntities,可以这么写:
var stats = dbContext.YourEntities // 用固定值1分组,相当于把所有数据归为一组,实现全局统计(对应SQL里无GROUP BY的情况) .GroupBy(_ => 1) .Select(group => new { Category = "Quality Of Service", // 对应SQL里的MAX('Quality Of Service'),直接赋值固定值即可 Excellent = group.Count(t => t.QualityOfService == "Excellent"), Very_Good = group.Count(t => t.QualityOfService == "VeryGood"), Good = group.Count(t => t.QualityOfService == "Good"), Bad = group.Count(t => t.QualityOfService == "Bad") // 如果SQL里还有更多评级的统计,继续在这里添加对应的Count语句就行 }) .FirstOrDefault(); // 因为只有一组结果,取第一个(或默认值)
LINQ查询语法写法
如果你习惯用查询式的LINQ,也可以这么写:
var stats = (from t in dbContext.YourEntities // 同样用固定值分组实现全局统计 group t by 1 into serviceGroup select new { Category = "Quality Of Service", Excellent = serviceGroup.Count(t => t.QualityOfService == "Excellent"), Very_Good = serviceGroup.Count(t => t.QualityOfService == "VeryGood"), Good = serviceGroup.Count(t => t.QualityOfService == "Good"), Bad = serviceGroup.Count(t => t.QualityOfService == "Bad") // 其他评级的统计逻辑同理添加 }).FirstOrDefault();
补充说明
SQL里的MAX('Quality Of Service')其实就是个固定字符串,因为所有行的这个值都一样,所以直接赋值即可,不用调用MAX函数。而LINQ里的Count(条件)就对应SQL里的COUNT(CASE WHEN ... THEN 1 END),只有符合条件的行会被计数,不符合的不会计入结果,效果完全一致。
内容的提问来源于stack exchange,提问作者Faizan
相关产品推荐
相关产品推荐

