如何在LINQ to Entity的Select子句中正确使用Join与Count?
错误原因
TotalComputers 字段赋值行的错误是因为 Count() 方法调用位置错误:Count() 是仅作用于集合类型的扩展方法,你原代码中是对单个字段 co.CardID 调用 Count(),EF 无法将单个字段识别为合法的集合输入,因此抛出参数类型错误。
另外你原有的子查询逻辑存在冗余:如果你的需求是统计IT部门总电脑数,重复关联Employe表可以优化;如果是统计每个IT员工的个人电脑数,子查询的关联逻辑完全错误,会返回所有IT部门的电脑总数给每一个员工。
修复方案
场景1:统计整个IT部门的总电脑数(所有员工行的TotalComputers值相同)
将Count()移动到子查询外部,作用于整个查询结果集合即可:
var device = (from u in db.Employe where u.CardID != null && u.Department.Contains("IT") select new { Id = u.ID, TotalComputers = (from co in db.EmployeComputer join dv in db.Employe on co.DeviceID equals dv.ID where dv.Department.Contains("IT") select co).Count(), }) .ToList();
场景2:统计每个IT员工名下的个人电脑数(每个员工行的TotalComputers对应自身的电脑数量)
不需要在子查询中重复关联Employe表,直接和外层当前员工ID关联即可,写法更简洁性能更好:
var device = (from u in db.Employe where u.CardID != null && u.Department.Contains("IT") select new { Id = u.ID, TotalComputers = db.EmployeComputer.Count(co => co.DeviceID == u.ID), }) .ToList();
内容的提问来源于stack exchange,提问作者user802782
相关产品推荐
相关产品推荐

