2011-01-13 9 views
4

私はしばらくこの上に私の頭を掻いてきました。私が拡張メソッドを作成して、Dateの項目のリストをグループ化すると、可能なグループ化を変更して、結果をDay、WeekまたはMonthでグループ化できるようにします。LINQ to SQL - 日/週/月別グループ

私は以下を思い付いたが、私は次のエラーを取得しておいてください。

メソッド 'System.ObjectのDynamicInvoke(System.Objectの[])は、' SQL

へのサポートの翻訳を持っていません

方法:私はエラーの原因となっているクエリ内のFuncの使用を想定してい

public static IQueryable<IGrouping<MonthDateGroup, T>> GroupByDate<T>(
    this IQueryable<T> items, 
    DateGroupFrequency grouping, 
    Expression<Func<T, DateTime?>> func) 
{ 
    var selector = func.Compile(); 
    IQueryable<IGrouping<MonthDateGroup, T>> grouped = null; 

    if (grouping == DateGroupFrequency.Daily) 
    { 
     grouped = from a in items 
        let date = selector(a).Value 
        group a by new MonthDateGroup 
        { 
         Day = date.Day, Month = date.Month, Year = date.Year 
        } 
        into g 
        select g; 
    } 
    //Rest of groupings... 

は、それがこのようなコードを生成することが可能ですか?

P.S.私はまだのFuncの、および式のまわりで私の頭をラップしようとしている:)

答えて

3

グループの構文はすべきではない:

group a by new MonthDateGroup 
{ 
a.Day = date.Day, a.Month = date.Month, a.Year = date.Year 
} 
2

クエリ自体はSQLに実行することができないようにあなたの問題が見えます。アイテムを使用する前にアイテムをIEnumerableに変換する必要があるかもしれません。これにより、SQLサーバーからメモリにデータがロードされるので、できるだけ遅くLINQチェーンに残すようにしてください。それはあなたの方法で変数を作成するに動作しない場合は、(上部付近)IEnumerableをではなく、のIQueryableかであることを

var itemsEnumerable = items.AsEnumerable(); 

をあなたの項目のパラメータを変更することができますいずれか

また、あなたを変更する必要があります戻り値の型はIQueryableからIEnumerableに

+0

SQL内で実行されるクエリが必要です。このクエリは、ジェネリックスとFuncパラメータを削除してクラスに結び付けると正常に動作しますが、複数のクエリに対して汎用サポートが必要で、パフォーマンス制約のためにSQLで実行する必要があります。私はクエリの仕事をするために必要な構文的な砂糖が足りないと思う。 – Mig

+0

LinqをSQLに変更することが可能かどうかは確かではない。基本的にSQLが独自のビットを入れる場所そこ。これはグループ化タスクなので、あなたはそれをサーバー上で実行しようとしましたか?私は、同じ量のデータがまだ返されているので、パフォーマンスはおそらくSQL上で実行するのと同等であると思います。 –