EF4:LINQ 2 实体查询在 C# 中有效,但在 VB 中无效

2024-01-03

[编辑:我在下面留下了原始问题,并提供了更多上下文和代码来重现问题。下面的简短版本包含了问题的本质]

简短版本:下面的查询抛出 System.NotSupportedException:“无法转换类型 'System.Linq.IOrderedQueryable1' to type 'System.Linq.IQueryable1'. LINQ to Entities 仅支持转换实体数据模型基元类型。”仅在 VB.Net 版本中引发该异常。转换为 C# 时,不会引发异常。

   Dim doesThisCrash = From outerOrder In orders
        Where outerOrder.ProductId =
        (From p In products Join o In orders On p.Id Equals o.ProductId
         Order By p.Id
         Select p.Id).FirstOrDefault()
        Select outerOrder
    doesThisCrash.ToList()

因此,为了使其崩溃,我们似乎需要一个子查询,其中原始 ObjectSet(订单)与另一个 ObjectSet(产品)连接并排序。仅使用订单或产品集时,不会发生崩溃。当省略 Order By 时,也不会发生崩溃。

我倾向于认为这是一个(VB.Net)编译器错误,除非我在这里忽略了一些明显的东西......

现在我的问题仍然存在:

  • 为什么看似完全相同的查询在 C# 中有效,但在 VB 中却无效?
  • 这个查询可以在 VB.Net 中运行吗?

[/EDIT]

可选的较长版本(原始问题):

我的域看起来非常不同,但我将问题转换为更简单的版本,其中包含以下实体(注意:我实际上使用 .edmx 设计器定义了这些实体,因此这是一个简化版本):

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime DateCreated { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public int CustomerId { get; set; }
        public int ProductId { get; set; }
        public DateTime OrderDate { get; set; }
    }

    public class Customer
    {
        public int Id { get; set; }
    }

我正在尝试在 VB.Net 中制定一个 linq-to-entities 查询,其结构应如下所示:

    Dim db = New SampleEntities()
    Dim orders As IQueryable(Of Order) = db.Orders
    Dim products As IQueryable(Of Product) = db.Products
    Dim currentDate = DateTime.Now

    Dim qLinq = From outerOrder In orders
                Where outerOrder.OrderDate = currentDate AndAlso
                outerOrder.ProductId =
                    (From p In products Join o In orders On p.Id Equals o.ProductId
                     Where o.OrderDate = outerOrder.OrderDate AndAlso
                            outerOrder.CustomerId = o.CustomerId
                     Order By p.DateCreated
                     Select p.Id).FirstOrDefault()
                Select outerOrder

这会引发 System.NotSupportedException:

“无法转换类型‘System.Linq.IOrderedQueryable1' to type 'System.Linq.IQueryable1'. LINQ to Entities 仅支持转换实体数据模型基元类型。”

当省略“Order By”部分时,不会引发异常。

我真的不明白为什么不支持这个查询的原因...所以我决定在 C# 中尝试同样的事情:

var qLinq = from oOut in orders
            where oOut.OrderDate == currentDate
                  && oOut.ProductId == 
                          (from p in products join o in orders on p.Id equals o.ProductId
                           where oOut.OrderDate == o.OrderDate 
                           && oOut.CustomerId == o.CustomerId
                           orderby p.DateCreated
                           select p.Id).FirstOrDefault()
                    select oOut;

令我惊讶的是,这有效!然后我将 C# 查询转换为扩展方法语法,然后返回 VB,但得到了相同的结果(C# 版本有效,VB.Net 版本引发相同的异常)。

所以我想我的问题是双重的:

  • 为什么看似完全相同的查询在 C# 中有效,但在 VB 中却无效?
  • 这个查询可以在 VB.Net 中运行吗?

作为参考,以下是扩展方法语法中的查询:

C#版本:

        var q = orders.Where(outerOrder => 
            outerOrder.OrderDate == currentDate &&
            outerOrder.ProductId == 
            (products
                .Join(orders, 
                    f => f.Id, 
                    o => o.ProductId,
                    (f, o) => new { f, o })
                .Where(t => t.o.OrderDate == outerOrder.OrderDate 
                           && outerOrder.CustomerId == t.o.CustomerId)
                .OrderByDescending(t => t.f.DateCreated)
                .Select(t => t.f.Id))
                .FirstOrDefault());

VB.NET版本:

    Dim q = orders.Where(Function(outerOrder) outerOrder.OrderDate = currentDate AndAlso
                             outerOrder.ProductId = (products.Join(orders,
                               Function(p) p.Id,
                               Function(o) o.ProductId,
                               Function(p, o) New With {.p = p, .o = o}).
                           Where(Function(x) x.o.OrderDate = outerOrder.OrderDate AndAlso
                                     outerOrder.CustomerId = x.o.CustomerId).
                           OrderByDescending(Function(x) x.p.DateCreated).
                           Select(Function(x) x.p.Id).
                           FirstOrDefault()))

我认为以下方法可行,但 SQL 很丑陋:

Dim qLinq = From outerOrder In orders
                Where outerOrder.OrderDate = currentDate AndAlso
                outerOrder.ProductId =
                    (From x In (From p In products
                                 Join o In orders On p.Id Equals o.ProductId
                                 Where o.OrderDate = outerOrder.OrderDate AndAlso
                                        outerOrder.CustomerId = o.CustomerId
                                 Select p.Id)
                    Order By x).FirstOrDefault()
                Select outerOrder
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF4:LINQ 2 实体查询在 C# 中有效,但在 VB 中无效 的相关文章

  • 从多播数据包中获取发送者 ip

    如何获取组播 UDP 数据包发送者的 IP 当前代码以同步 阻塞方式设置 参见下面的注释 这是代码 private void receive string mcastGroup SetMcastGroup s new Socket Addr
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • Bjarne Stroustrup 的 C++ 编程和实践第 2 版中的使用单参数排序

    我正在阅读 Bjarne Stroustrup new C PP 第二版 他在其中使用了排序方法 sort someVector 使用此方法编译代码时出现以下错误 3 IntelliSense 没有重载函数 sort 的实例与参数列表匹配
  • C#/Linq 获取相邻的集合

    我有一个有序列表 例如 0 1 2 6 7 10 我想要得到数字加 1 的集合 我想要第一个数字和计数或系列 所以我会得到开始 0 计数 3开始 6 计数 2开始 10 计数 1 我怎样才能在 C 中做到这一点 答案是我认为最好的方式 对我
  • 路径不是有效的虚拟路径

    下面的方法采用指向 xml 文件的路径 tree LoadContentFile path 我从本地文件系统传递完整路径 或使用Server MapPath 但每次我总是收到此错误 Path 不是有效的虚拟路径 编辑 我正在使用Teleri
  • 如何使用 ioread64() 和 iowrite64() 访问 IO 内存?

    背景 我目前正在编写一个设备驱动程序教育设备 https github com qemu qemu blob master hw misc edu c在 qemu RISC V 中 由此question https stackoverflo
  • libc++ 中短字符串优化的机制是什么?

    这个答案 https stackoverflow com a 10319672 1805388给出了短字符串优化 SSO 的高级概述 但是 我想更详细地了解它在实践中是如何工作的 特别是在 libc 实现中 字符串必须有多短才能符合 SSO
  • LongListSelector 更改 ItemTemplate

    我想动态改变ItemTemplate of a LongListSelector 我通过将其绑定到 ViewModel 中的属性来做到这一点
  • C++ 将 HashMap 对象返回给 Java

    我有一个 JAVA 调用的 JNI 函数 需要构建并返回一个 HashMap 映射的键是 String 相应的值是 boolean 或 Boolean 任何一个都可以 只要它有效 使用我当前的代码 如下 该字符串已成功添加到返回的映射中 并
  • C# 使用正则表达式获取内容内的 html 标签和下一个元素

    这是我的html div class 50f3 Followed by a href https www facebook com zurabj followers 7 583 people a div div class 50f3 Fri
  • Makefile:没有规则来制作目标

    我正在关注本指南makefile http www cs colby edu maxwell courses tutorials maketutor 但我根本不理解最后一个例子 并且我无法让我的 makefile 工作 因为我收到了错误ma
  • 使用 jni 从 C 调用 java 函数

    我正在编写一个简单的程序来从我的 C 程序调用 Java 函数 以下是我的代码 include
  • 结构体指针运算符猜想(理论)

    结构体指针的使用非常频繁 因此有一个特殊的运算符 gt 下面的表达式是等价的 x y x gt y 将此运算符简单地视为如下定义的预处理器宏是否公平 define x gt x 为什么或者为什么不 或者它从一开始就被编码为运算符 这有何不同
  • 如何在其他项目中添加NLog类库项目

    我已经用 C 创建了一个控制台项目 在该项目中我使用 NLog 进行日志记录 当我运行该项目时 它成功登录到多个目标 例如控制台 文件 EventLog 以及 Sentinal 但是 当我将此项目作为类库并尝试添加对另一个项目的引用时 它不
  • 处理多个自动重定向的正确方法是什么?

    我有一个网站 基本上允许客户构建一个包含可配置项目的购物车 用户将选择一个项目 系统会提示他们选择他们想要的第一个选项 然后他们将被发送到第二个步骤 在那里他们选择第二个选项 等等 步骤数和选项数是可变的 因为它们是由客户定义的 通常该项目
  • 如何使用 Qt DOM 通过此语法获取 xml 属性

    我正在使用 Qt DOM XML 解析器 并且遇到了如下属性定义的问题
  • 处理后退导航 Windows 10 (UWP)

    在我的 Xaml 页面中 我有一个框架 我正在尝试使用 backButton 事件来在frame 内导航 所以我尝试使用这段代码 public MainPage this InitializeComponent if Windows Fou
  • 隐式构造函数和默认构造函数有什么区别?

    这是非常微不足道的 但是捷克语 我的母语 不区分隐式和默认 所以我对一些捷克语翻译感到困惑 隐式和默认构造函数或构造函数调用之间有什么区别 struct Test Test int n 0 您能用这些术语描述以下语句的作用吗 Test t1
  • 创建 ip 网络数据包 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须使用任何协议手动创建自己的网络
  • 我可以向函数添加属性以防止重入吗?

    目前 我有一些如下所示的功能 private bool inFunction1 false public void function1 if inFunction1 return inFunction1 true do stuff whic

随机推荐