[英]How to query in EF core with OrderByDescending, Take, Select and FirstOrDefault
我需要根據 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.