繁体   English   中英

如何使用 OrderByDescending、Take、Select 和 FirstOrDefault 在 EF 核心中进行查询

[英]How to query in EF core with OrderByDescending, Take, Select and FirstOrDefault

所以我有一个名为Summaries的表,它看起来像这样在此处输入图片说明

我需要根据 CoveredDate 对 TotalPieces 的最新条目求和,并应按 ServiceCode 分组并按月查询,例如 ServiceCode 'A' 在 2020-01-01、2020-01-02、2020-01- 上有条目03、2020-01-31、2020-02-01、2020-02-28、2020-02-29 和 ServiceCode 'B' 在 2020-01-01、2020-01-02、2020-01-31 上有条目, 2020-02-20, 2020-02-21, 我需要得到基于月份的总和,1 月“A”的最新条目是 2020-01-31,“B”的最新条目是 2020-01 -31,我需要将他们的“TotalPieces”相加,所以我应该得到 25 + 25 = 50。

基本上我需要做的是

  • 根据CoveredDate和月/年获取所有最新条目
  • ServiceCode求和TotalPieces

我有一个有效的查询,但这只是一种解决方法,因为我无法正确查询。

            int sum_totalpieces = 0;
            foreach (var serviceCode in service_codes)
            {
                var totalpieces = _DbContext.ActiveSummaries.Where(acs =>
                                    acs.CoveredDate.Date.Month == query_month
                                    && acs.CoveredDate.Date.Year == query_year
                                    && acs.service_codes == serviceCode
                                    )
                    .OrderByDescending(obd => obd.CoveredDate)
                    .Take(1)
                    .Select(s => s.TotalPieces)
                    .ToList()
                    .FirstOrDefault();

                sum_totalpieces += totalpieces;
            }

service_codes只是一个字符串列表

如果你们可以摆脱他们的foreach块并在查询时使用services_codes.Contains() ,或者其他使结果更快的解决方法,那就太好了。 非常感谢。

这会做到,但我认为它不会转换为 SQL 并在服务器上运行:

    _DbContext.ActiveSummaries
            .Where(b =>
                b.CoveredDate >= new DateTime(2020,1,1) &&
                b.CoveredDate < new DateTime(2020,2,1) && 
                new [] { "A", "B" }.Contains(b.ServiceCode)
            )
            .GroupBy(g => g.ServiceCode)
            .Sum(g => g.OrderByDescending(gb=> gb.CoveredDate).First().TotalPieces);


如果您想将其作为原始 SQL 来执行以获得最佳性能,它看起来像:

SELECT SUM(totalpieces)
FROM 
  x 
  INNER JOIN 
  (
    SELECT servicecode, MAX(covereddate) cd 
    FROM x 
    WHERE x.servicecode IN ('A','B') AND covereddate BETWEEN '2020-01-01' AND '2020-01-31'
  )y ON x.servicecode=y.servicecode and x.covereddate = y.cd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM