10

.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クエリなどを使用する可能性があります)?

4

2 に答える 2

10

ここでEntityFunctions *を使用する方がはるかに簡単です。

var result =
    from query in DbManager.GetTable<SomeTableModel>()
    group query by EntityFunctions.TruncateTime(query.CreationDate)
    into list1
    select list1;

* Entity Framework 6 のDbFunctions 。

于 2012-11-24T10:12:36.777 に答える