C#Linq问题:如何识别和计算集合中的项目

Zac*_*ott 3 c# linq sql-server-2005

我有一个朋友正在使用c#Linq来报告下表:

varchar(50) name
datetime    when
Run Code Online (Sandbox Code Playgroud)

客户希望选择要汇总的列,例如今年的总计,去年的总计,两周前的总计等等.每列将有一些开始和结束时间,他们用计数汇总.我为他做了一个快速选择声明:

select A.name as [Name],

    (select count(*) from mytable B where A.name = B.name and 
     datepart(yy, when) = datepart(yy,getdate())) as [This Year],

    (select count(*) from mytable B where A.name = B.name and
     datepart(yy, when) = (datepart(yy,getdate()) - 1)) as [Last Year]

from (select distinct name from mytable) A
Run Code Online (Sandbox Code Playgroud)

我还建议他将每个计算字段设为一个委托,这样他就可以在查询之外包含计算混乱.假设每个委托都有一个开始和结束日期,计算每个不同名称的命中数,那么任何人都想要了解Linq c#代码的样子?

Amy*_*y B 5

很简单的翻译:

DateTime Now = DateTime.Now;

DateTime thisYearStart = new DateTime(Now.Year, 1, 1);
DateTime thisYearEnd = thisYearStart.AddYears(1);
DateTime lastYearStart = thisYearStart.AddYears(-1);
DateTime lastYearEnd = thisYearStart

var query = dc.MyTable
  .GroupBy(a => a.Name)
  .Select(g => new
  {
    Name = g.Key,
    ThisYearCount = g
      .Count(b => thisYearStart <= b.When && b.When < thisYearEnd)
    LastYearCount = g
      .Count(b => lastYearStart <= b.When && b.When < lastYearEnd)
  });
Run Code Online (Sandbox Code Playgroud)

很明显,这是我翻译的重构的sql:

SELECT A.Name as [Name],
  SUM(CASE WHEN @start1 <= A.When AND A.When < @end1 THEN 1 ELSE 0 END) as ThisYear,
  SUM(CASE WHEN @start2 <= A.When AND A.When < @end2 THEN 1 ELSE 0 END) as LastYear
FROM MyTable A
GROUP BY A.Name
Run Code Online (Sandbox Code Playgroud)