[英]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.