【问题标题】:COUNT(DISTINCT *) in ef core 2.1ef core 2.1 中的 COUNT(DISTINCT *)
【发布时间】:2018-12-27 02:34:32
【问题描述】:
SELECT
  e.EmpName,
  me.RemarkNumber,
  me.RemarkPeopleNumber
FROM
  EmployeeInfo e
  LEFT JOIN (
    SELECT
      COUNT(RemarkId) As RemarkNumber,
      COUNT(DISTINCT MemberId) As RemarkPeopleNumber,
      CreateUser
    FROM
      MemberRemark
    WHERE
      RemarkStatus = 0
    GROUP BY
      CreateUser
  ) AS me On e.EmpName = me.CreateUser
WHERE
  BranchCode = '0000'
  And [Status] = 0

如何将其转换为 LINQ?

from e in db.EmployeeInfo
join me in (
    from memberRemarks in db.MemberRemark
    where memberRemarks.RemarkStatus == 0
    group memberRemarks by new
    {
        memberRemarks.CreateUser,
    } into g
    select new
    {
        RemarkNumber = g.Count(),
        RemarkPeopleNumber = g.Select(m => m.MemberId).Distinct().Count(),
        g.Key.CreateUser
    }
) on new { e.EmpName } equals new { EmpName = me.CreateUser } into meJoin
from me in meJoin.DefaultIfEmpty()
where e.BranchCode == "0000" & &e.Status == 0
select new
    {
        e.EmpName,
        me.RemarkNumber,
        me.RemarkPeopleNumber
    };

我收到了这个错误

RemarkPeopleNumber = g.Select(m=>m.MemberId).Distinct().Count(), //错误

使用asp.net core mvc 2.1 + ef core 2.1 + mssql

【问题讨论】:

  • MySQL 查询对于 LINQ 来说可能太多了,而是尝试将其放入存储过程中并返回所需的内容,如下所示sunali.com/2012/10/10/…
  • 我知道mysql使用Pomelo驱动可以使用.DistinctBy(x => x.MemberId).Count()。但是是mssql
  • @boateng 看在上帝的份上,请不要建议存储过程。
  • 好的,视图也可以。

标签: c# linq asp.net-core-2.1 ef-core-2.1


【解决方案1】:

也许如果您将查询分解成多个部分,处理起来会更好?使用我的SQL to LINQ Recipe,我会像这样翻译你的 SQL:

var ePart = from e in db.EmployeeInfo
            where e.BranchCode == "0000" && e.Status == 0
            select e;
var mrPart = from mr in db.MemberRemark
             where mr.RemarkStatus == 0
             group mr by mr.CreateUser into mrg
             select new {
                 CreateUser = mrg.Key,
                 RemarkNumber = mrg.Count(),
                 RemarkPeopleNumber = mrg.Select(mr => mr.MemberId).Distinct().Count()
             };
var ans = from e in ePart
          join me in mrPart on e.EmpName equals me.CreateUser into mej
          from me in mej
          select new {
            e.EmpName,
            me.RemarkNumber,
            me.RemarkPeopleNumber
          };

【讨论】:

  • 谢谢,我用的是linq2db.EntityFrameworkCore,支持
猜你喜欢
  • 2021-06-20
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
相关资源
最近更新 更多