2

当我编写Group Byin 查询表达式语法时,编译器会自动选择Enumerable.GroupBy我想要的 tareget 方法,我得到一个IEnumerableback 而不是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()之间的代码没有明显差异。IEnumerableIQueryable

问题是,LINQ to Entities(我假设其他数据库支持的 LINQ 实现)依赖于表达式树来转换为 SQL。这意味着IEnumerablelambda 版本不会IDbSet像我在这个旧问题中发现的那样对抗。

4

1 回答 1

2

问题是Queryable.GroupBy()返回IQueryable<IGrouping<TKey, TSource>>,在哪里IGrouping<TKey, TSource>实现IEnumerable<TSource>,但不是IQueryable<TSource>

而且我相信您的代码无论如何都不会起作用,因为ItemsOfColor()实际上不会被调用。相反,EF 会得到一个调用ItemsOfColor(). 而且由于它不知道那个方法,它会抛出一个异常。

于 2013-04-11T21:50:56.270 回答