无法通过 Linq 查询获取多个表字段的计数
Posted
技术标签:
【中文标题】无法通过 Linq 查询获取多个表字段的计数【英文标题】:Can't Get Count of More than one table fields Through Linq Query 【发布时间】:2021-05-31 19:22:42 【问题描述】:我的汇总查询
var attendanceAggregate = (from ed in _context.EmployeeDetail
join uf in _context.userInfo on ed.employeeCode equals uf.SSN
join ct in _context.EmployeeContract on ed.employeeCode equals ct.EmployeeCode
join chio in _context.checkinout on uf.USERID equals chio.USERID
join vlr in _context.LeaveRequest.Where(v => v.VerifiedByHR != null)
.Where(s => s.RequestDate >= FromDate && s.RequestDate <= ToDate)
on ct.ContractID equals vlr.ContractID into vlri
from vlr in vlri.DefaultIfEmpty()
join tlr in _context.LeaveRequest.Where(v => v.ApprovedBy != null && v.RequestedBy != null && v.RejectedBy == null)
.Where(s => s.RequestDate >= FromDate && s.RequestDate <= ToDate)
on ct.ContractID equals tlr.ContractID into tlri
from tlr in tlri.DefaultIfEmpty()
where uf.USERID == chio.USERID && chio.CHECKTIME != null
&& chio.CHECKTIME >= FromDate && chio.CHECKTIME <= ToDate
group new ed, chio, ct, vlr, tlr by new
ed.employeeCode,
ed.name,
ed.surName,
ed.nameDari,
ed.surNameDari
into g
select new
g.Key.name,
//fullName = _culture.GetLanguageId() == 1 ? g.Key.name + ' ' + g.Key.surName : g.Key.nameDari + ' ' +
g.Key.surNameDari,
code = g.Key.employeeCode,
TotalPendingRequest=g.Count(s=> s.tlr.LeaveRequestID != null)
).ToList();
以及发生在我身上的错误
'.Count(s => (Nullable)s.tlr.LeaveRequestID != null)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
【问题讨论】:
错误很明显。您也不会在 SQL 中将WHERE
放入 COUNT
中。 LINQ 不是 SQL 的替代品,这个庞大的查询是您不应该使用 LINQ 的一个明显例子。如果实体之间存在适当的关系,那么在一定程度上使用 LINQ 是有意义的,因此您不必编写任何这些 join
s
您使用的是哪个 EF 版本?这个查询是动态生成的吗?这就是为什么在某些连接中有多个Where()
调用的原因吗?这个查询可以通过适当的关系简化很多。不需要任何join
s。可以在最后的单个 where
子句中执行对所有实体的过滤。另一方面,带有一些 LEFT JOIN 和 Where 和 Group By 的 SQL 视图可能会更清晰
我使用 ef 4 我首先在 sql 中生成查询,然后在 linq 中编写查询我在 linq 中生成的查询在相同的连接和 sam where 子句下工作正常。但在 linq 中不起作用
如果你在 EF/LINQ 中使用 JOIN,你就有一个 bug。从实体关系生成 JOIN 是 EF 的工作。 EF 没有表,DbContext 不是数据库模型。 LINQ 旨在简化查询。您在此处发布的查询非常难以阅读
所以我必须在这里使用存储过程而不是 linq ??
【参考方案1】:
此问题需要有关 EF Core 版本的详细信息。 EF Core 5 可以翻译此查询,但不能翻译早期版本。但是有使用Sum
的解决方法
...
select new
g.Key.name,
g.Key.surNameDari,
code = g.Key.employeeCode,
TotalPendingRequest = g.Sum(s => s.tlr.LeaveRequestID != null ? 1 : 0)
【讨论】:
总和正在工作,但我想计算请假请求的总记录 这在您的问题中没有描述。count the total record of leave request
的任何 SQL 类似物?
tnx 为您提供帮助 我的问题已通过 Sql 过程解决以上是关于无法通过 Linq 查询获取多个表字段的计数的主要内容,如果未能解决你的问题,请参考以下文章
通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录
LINQ 查询多个组和最新记录的计数 - Oracle DB
我想在 dotnetcore web api 控制器中使用 linq 方法通过 entityframework 从多个表中获取数据