簡體   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