如何为指定场景编写LINQ查询:SQL转LINQ获取Carton表全量数据及关联计数
解决方案
你现有代码存在两个核心问题:
- Where条件过滤掉了没有关联
CartonDetail的Carton记录,无法实现返回全部Carton的需求 - GroupBy仅选择
CartonNumber作为值序列,导致分组后无法正确关联原记录的其他信息,计数逻辑也不符合要求
推荐实现(基于导航属性,写法最简)
如果你的Carton实体配置了CartonDetails反向导航属性(EF会根据CartonDetail里的Carton导航自动生成,无需额外配置),直接用下面的写法即可,EF会自动翻译成符合要求的左连接计数SQL,无关联明细的Carton的EquipmentCount会返回0:
var cartons = db.Cartons.Select(c => new CartonViewModel { Id = c.Id, CartonNumber = c.CartonNumber, EquipmentCount = c.CartonDetails.Count() }).ToList(); return View(cartons);
手动左连接实现(无反向导航属性时使用)
如果没有配置反向导航属性,可以手动写左连接逻辑:
var cartons = (from c in db.Cartons join cd in db.CartonDetails on c.Id equals cd.CartonId into detailGroup from d in detailGroup.DefaultIfEmpty() group d by new { c.Id, c.CartonNumber } into grouped select new CartonViewModel { Id = grouped.Key.Id, CartonNumber = grouped.Key.CartonNumber, EquipmentCount = grouped.Count(d => d != null) }).ToList(); return View(cartons);
补充注意事项
- 你原有代码中查询变量命名为
apv,但最后返回的是cartons,注意修正这个笔误 - 如果要实现你原SQL的内连接逻辑(仅返回有明细的Carton),只需要在导航属性写法的
Select前加Where(c => c.CartonDetails.Any())即可
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

