无法通过 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 是有意义的,因此您不必编写任何这些 joins 您使用的是哪个 EF 版本?这个查询是动态生成的吗?这就是为什么在某些连接中有多个Where() 调用的原因吗?这个查询可以通过适当的关系简化很多。不需要任何joins。可以在最后的单个 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获取表中值的计数

LINQ 查询多个组和最新记录的计数 - Oracle DB

使用 LINQ 获取连接表中的最大计数

Linq查询连接guid与varchar字段

我想在 dotnetcore web api 控制器中使用 linq 方法通过 entityframework 从多个表中获取数据