当我在查询表达式语法中编写 Group By
时,编译器会自动选择 Enumerable.GroupBy
作为我想要的目标方法,并且我得到一个 IEnumerable
code> 返回而不是 IQueryable
。这意味着后续的 g.Sum
调用(在我的 Select
内部)需要一个 Func(Of TSource, int)
而不是 表达式(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()
和 >Dim e As Expression(Of Func(Of String, Integer)) = Function(x) x.Length()
有效),因此 IEnumerable
之间的代码没有明显差异> 和 IQueryable
。
问题是,LINQ to Entities(我假设其他数据库支持的 LINQ 实现)依赖于表达式树来转换为 SQL。这意味着 IEnumerable
lambda 版本无法针对 IDbSet
,正如我在 this 中找到的那样。老问题。
最佳答案
问题是 Queryable.GroupBy()
返回IQueryable<IGrouping<TKey, TSource>>
,其中IGrouping<TKey, TSource>
实现IEnumerable<TSource>
,但不是IQueryable<TSource>
.
而且我相信你的代码无论如何都不会工作,因为 ItemsOfColor()
实际上不会被调用。相反,EF 将获得一个调用 ItemsOfColor()
的表达式。 。由于它不知道该方法,因此会抛出异常。
关于vb.net - 我可以在查询表达式语法中指定 Queryable.GroupBy (而不是 Enumerable.GroupBy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15949279/