クエリ式構文でa を記述すると、コンパイラは目的のターゲット メソッドとしてGroup By
自動的に選択し、.の代わりに backを取得します。つまり、後続の呼び出し ( my 内) では、 の代わりに が期待されます。代わりに を強制的に使用して を返す方法はありますか?Enumerable.GroupBy
IEnumerable
IQueryable
g.Sum
Select
Func(Of TSource, int)
Expression(Of Func(Of TSource, int))
Group By
Queryable.GroupBy
IQueryable
考案されたサンプルコード
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()
です) 。IEnumerable
IQueryable
問題は、LINQ to Entities (そして、他の db ベースの LINQ 実装を想定しています) は、式ツリーに依存して SQL に変換されることです。つまり、この古い質問で見つけたように、IEnumerable
ラムダ バージョンはan に対して機能しません。IDbSet