在 LINQ 中实现 SQL 查询

Implement an SQL query in LINQ

我正在尝试在 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 不是 standard mapped function,唉,否则它可以用于将日期转换为月份级别的粒度