我正在尝试在LINQ中实现以下查询,但我找不到解决方案:
SQL:
SELECT COUNT(*) AS AmountMonths
FROM (SELECT SUBSTRING(CONVERT(NVARCHAR(12), pay_date, 112), 1, 6) AS Month
FROM #tmp
GROUP BY SUBSTRING(CONVERT(NVARCHAR(12), pay_date, 112), 1, 6)) AS AmountMonths
我需要的是得到客户付款的月数,条件是可能有几个月没有付款。
在c#中,我尝试了以下操作:int amountMonths = payDetail.GroupBy(x => Convert.ToDateTime(x.PayDate)).Count();
和
int amountMonths = payDetail.GroupBy(x => Convert.ToDateTime(x.PayDate).Month).Count();
但是我没有得到预期的结果。
(假设您正在使用EF Core)
你就快到了。你可以这样做:
var amountMonths = context.AmountMonths.GroupBy(c => new { c.PayDate.Year, c.PayDate.Month }).Count();
这将转换成如下内容:
SELECT COUNT(*)
FROM (
SELECT DATEPART(year, [a].[PayDate]) AS [a]
FROM [AmountMonths] AS [a]
GROUP BY DATEPART(year, [a].[PayDate]), DATEPART(month, [a].[Pay_Date])
) AS [t]
我觉得比创建字符串并将其分割更可取。EOMONTH不是标准的映射函数,否则它可以用于将日期转换为月级粒度