2

クエリ式構文でa を記述すると、コンパイラは目的のターゲット メソッドとしてGroup By自動的に選択し、.の代わりに backを取得します。つまり、後続の呼び出し ( my 内) では、 の代わりに が期待されます。代わりに を強制的に使用して を返す方法はありますか?Enumerable.GroupByIEnumerableIQueryableg.SumSelectFunc(Of TSource, int)Expression(Of Func(Of TSource, int))Group ByQueryable.GroupByIQueryable

考案されたサンプルコード

Dim myQuery = From x In DataSource.Items
              Group By x.Key Into g = Group
              Select New With {
                  .Key = Key,
                  .RedItems = g.Sum(ItemsOfColor(Colors.Red)) '<== invalid because g.Sum expects a lambda
              }

Private Function PurpleItems(color As Integer) As Expression(Of Func(Of Item, Integer))
    Return Function(item) If(item.Color = color, 1, 0)
End Function

なぜ私はこれをしたいのですか? コンパイラは、ターゲット変数の型に基づいてラムダと式を自動的に変換します (つまり、 と の両方Dim f As Func(Of String, Integer) = Function(x) x.Length()が有効Dim e As Expression(Of Func(Of String, Integer)) = Function(x) x.Length()です) 。IEnumerableIQueryable

問題は、LINQ to Entities (そして、他の db ベースの LINQ 実装を想定しています) は、式ツリーに依存して SQL に変換されることです。つまり、この古い質問で見つけたように、IEnumerableラムダ バージョンはan に対して機能しません。IDbSet

4

1 に答える 1

2

問題は、implements を返すがQueryable.GroupBy()、返さないことです。IQueryable<IGrouping<TKey, TSource>>IGrouping<TKey, TSource>IEnumerable<TSource>IQueryable<TSource>

ItemsOfColor()そして、実際には呼び出されないため、コードはとにかく機能しないと思います。代わりに、EF は を呼び出す式を取得しますItemsOfColor()。そして、そのメソッドがわからないため、例外がスローされます。

于 2013-04-11T21:50:56.270 に答える