vb.net - 我可以在查询表达式语法中指定 Queryable.GroupBy (而不是 Enumerable.GroupBy)

标签 vb.net linq expression-trees linq-query-syntax

当我在查询表达式语法中编写 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/

相关文章:

c# - 使用 XPath 查找所有 JavaScript 类型脚本元素

c# - List<T> 是常量、表达式参数还是表达式树中的其他内容?

c# - 为什么使用 + 运算符的字符串连接适用于 C# 中的动态类型?

c# - 检测 winform 中窗口的 X 按钮单击

vb.net - 在 VB.NET 中,如何获取按钮的文本以在其自己的事件处理程序中更改?

.net - 使用 ADO.net(OLEDB) 导入 UTF-8 CSV 文件

vb.net - 有谁知道查看 VB.NET 项目的所有编译器警告的方法吗?

c# - 为什么 Enumerable.OrderBy<TSource, TKey> 方法在不使用比较器时工作得更快

linq - SharePoint、List.Items 和 List.GetItems(Query) 和 Linq

c# - 具有字符串赋值和获取值的表达式树