LINQ:在datetime字段中按月和年分组

tsi*_*ilb 41 t-sql linq group-by substring

我有一个带有日期时间字段的表.我想检索按月/年组合分组的结果集以及该月/年内出现的记录数.如何在LINQ中完成?

我能够弄清楚的最接近的是TSQL:

select substring(mo,charindex(mo,'/'),50) from (
select mo=convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)) 
 ,qty=count(convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created)))
from posts 
group by convert(varchar(2),month(created)) + '/' + convert(varchar(4), year(created))
) a
order by substring(mo,charindex(mo,'/')+1,50)
Run Code Online (Sandbox Code Playgroud)

但我不会说有效......

Jer*_*emy 67

var grouped = from p in posts
     group p by new { month = p.Create.Month,year= p.Create.Year } into d
     select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count() };
Run Code Online (Sandbox Code Playgroud)

这是LINQ中可用的DateTime函数列表.为此,您还需要了解多列分组

有序下降

var grouped = (from p in posts 
  group p by new { month = p.Create.Month,year= p.Create.Year } into d 
  select new { dt = string.Format("{0}/{1}",d.Key.month,d.Key.year), count = d.Count()}).OrderByDescending (g => g.dt);
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 15

这适用于那些试图完成同样但使用lambda表达式的人.

假设您已经拥有一组实体,并且每个实体都将OrderDate作为其属性之一.

yourCollection
// This will return the list with the most recent date first.
.OrderByDescending(x => x.OrderDate)
.GroupBy(x => new {x.OrderDate.Year, x.OrderDate.Month})
// Bonus: You can use this on a drop down
.Select(x => new SelectListItem
        {
           Value = string.Format("{0}|{1}", x.Key.Year, x.Key.Month),
           Text = string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count())
        })
.ToList();
Run Code Online (Sandbox Code Playgroud)

如果您不需要SelectListItem的集合,那么只需用以下内容替换select:

.Select(x => string.Format("{0}/{1} (Count: {2})", x.Key.Year, x.Key.Month, x.Count()))
Run Code Online (Sandbox Code Playgroud)


Rol*_*n C 6

你也可以这样做

from o in yg
group o by o.OrderDate.ToString("MMM yyyy") into mg
select new { Month = mg.Key, Orders = mg }
Run Code Online (Sandbox Code Playgroud)

你的结果将是

{Jan 2014, 25} {Feb 2015, 15} 等等...