Когда я пишу Group By
в синтаксисе выражения запроса, компилятор автоматически выбирает 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 (и я предполагаю, что другие реализации LINQ, поддерживаемые базой данных) полагаются на деревья выражений для перевода в SQL. Это означает, что лямбда-версия IEnumerable
не будет работать против IDbSet
, как я нашел в этом старом вопросе. .
g.AsQueryable().Sum
? - person Corey Adler   schedule 11.04.2013DataSource.Items
? - person svick   schedule 11.04.2013IDbSet(Of Item)
, который реализуетIQueryable(Of Item)
- person just.another.programmer   schedule 11.04.2013