当我编写Group By
in 查询表达式语法时,编译器会自动选择Enumerable.GroupBy
我想要的 tareget 方法,我得到一个IEnumerable
back 而不是IQueryable
. 这意味着后续g.Sum
调用(在 my 内部Select
)需要 aFunc(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
我为什么要这样做?
编译器会根据目标变量类型自动在 lambda 和表达式之间进行转换(即Dim f As Func(Of String, Integer) = Function(x) x.Length()
和都是有效的),因此 an和Dim e As Expression(Of Func(Of String, Integer)) = Function(x) x.Length()
之间的代码没有明显差异。IEnumerable
IQueryable
问题是,LINQ to Entities(我假设其他数据库支持的 LINQ 实现)依赖于表达式树来转换为 SQL。这意味着IEnumerable
lambda 版本不会IDbSet
像我在这个旧问题中发现的那样对抗。