2009-04-18 13 views
31

日時フィールドを持つテーブルがあります。月と年の組み合わせでグループ化された結果セットとその月/年に表示されるレコードの数を取得したいと思います。これはLINQでどのように行うことができますか?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) 

しかし、私は働くこと言わないだろう...

答えて

59
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() }; 

ここLINQで利用可能なのDateTime機能のリストです。これが機能するために、あなたはまた、multi-column grouping

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); 
+0

私はこの月を最初の現在の月のように並べ替えたいですか?助けてください –

+0

あなたはorderbydescendingを追加することでそれを行うことができます – Jeremy

2

This Siteはあなたの要求を満たす必要がある例があります。これは基本的な構文です

from o in yg 
group o by o.OrderDate.Month into mg 
select new { Month = mg.Key, Orders = mg } 
+6

複数の注文を含むリストでは、2010年1月、2011年および2012年の注文が同じグループにまとめられます。 – Moulde

1

あなたは

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

あなたの結果は

{2014年1月になります。この方法は、それをも行うことができ降順注文理解する必要があります、25} {2015年2月15日} ...

7

これは、同じことを達成しようとしているが、ラムダ式を使っている人のためのものです。

すでにエンティティのコレクションがあり、各エンティティにそのプロパティの1つとして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(); 

あなたがSelectListItemのコレクションを必要としない場合は、この1つだけで選択を置き換える:ここ

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

は、DateTimeの中でグループ化するためのシンプルなソリューションです。

List<leaveallview> lav = new List<leaveallview>(); 
lav = dbEntity.leaveallviews.Where(m =>m.created==alldate).ToList(); 
dynamic lav1 = lav.GroupBy(m=>m.created.Value.GetDateTimeFormats()).FirstOrDefault().ToList(); 
関連する問題