.NETとEntityFrameworkを使用しています。時間部分のない日付でテーブルをグループ化したい。
私はクラスを持っています:
public sealed class QueryItem {
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
}
そして、その方法(DbManagerとは何かを知りたい場合は、BLToolkitを使用しています):
protected override IQueryable<QueryItem> InitiateQuery() {
return
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select new QueryItem {Year = list1.Key.Year, Month = list1.Key.Month, Day = list1.Key.Day};
}
このメソッドでは、linqはこのSQLクエリに変換されます。
SELECT
[query].[CreationDate]
FROM
[SomeDatabase.SomeTable] [query]
GROUP BY
DatePart(Year, [query].[CreationDate]),
DatePart(Month, [query].[CreationDate]),
DatePart(Day, [query].[CreationDate]),
[query].[CreationDate]
そして、これは日付だけでグループ化されないため、間違ったクエリです。
しかし、このコードを使用する場合(使用できない場合は、クラスオブジェクトを返す必要があります):
var result =
from query in DbManager.GetTable<SomeTableModel>()
group query by new { Year = query.CreationDate.Year, Month = query.CreationDate.Month, Day = query.CreationDate.Day }
into list1
select list1;
これに翻訳されます:
SELECT
[t1].[c1] as [c11],
[t1].[c2] as [c21],
[t1].[c3] as [c31]
FROM
(
SELECT
DatePart(Year, [selectParam].[CreationDate]) as [c1],
DatePart(Month, [selectParam].[CreationDate]) as [c2],
DatePart(Day, [selectParam].[CreationDate]) as [c3]
FROM
[SomeDatabase.SomeTable] [selectParam]
) [t1]
GROUP BY
[t1].[c1],
[t1].[c2],
[t1].[c3]
そして、これは正しいクエリです。
Entity Frameworkがクエリなどを最適化しようとしていると思いますが、これが間違ったクエリを取得した理由です。
私は正しいですか?私はそれを正しい方法でやっていますか?どうすればよいですか(直接SQLクエリなどを使用する可能性があります)?