4

私はしばらくの間、これについて頭を悩ませてきました。拡張メソッドを作成して、アイテムのリストを日付でグループ化するとします。可能なグループ化を変更して、結果を日、週、または月でグループ化できるようにします。

以下を思いつきましたが、次のエラーが引き続き発生します。

メソッド 'System.Object DynamicInvoke(System.Object[])' は SQL への変換をサポートしていません

メソッド:

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...

クエリ内での Func の使用がエラーの原因であると想定していますが、このようなコードを生成することは可能ですか?

PS私はまだFuncと式に頭を悩ませようとしています:)

4

2 に答える 2

3

グループ構文は次のようにすべきではありません:

group a by new MonthDateGroup
{
 a.Day = date.Day, a.Month = date.Month, a.Year = date.Year
}
于 2011-01-13T11:59:44.300 に答える
2

あなたの問題は、クエリ自体を SQL で実行できないようです。アイテムを使用する前に、アイテムを IEnumerable に変換する必要がある場合があります。これにより、データが SQL サーバーからメモリに読み込まれるため、LINQ チェーンのできるだけ遅くに残す必要があることに注意してください。

items パラメーターを IQueryable ではなく IEnumerable に変更するか、それが機能しない場合はメソッドで変数を作成します (上部近く)。

var itemsEnumerable = items.AsEnumerable();

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

于 2011-01-13T12:51:08.017 に答える