尝试返回 IQueryable 时发生转换错误

2024-04-28

我有一个查询应该返回IQueryable<MyType>。代码如下所示:

public IQueryable<MyType> GetFooList()
{
    var query = (from x in dbContext.TableX
                 join y in dbContext.TableY on x.our_id equals y.our_id 
                 join z in dbContext.TableZ on y.our_id equals z.our_id 
                 join a in dbContext.TableA on z.other_id equals a.other_id 
                 where !string.IsNullOrEmpty(x.status)
                 select new
                 {
                   (fields....)
                 })
                 .AsQueryable();
    IQueryable<MyType> result = (IQueryable<MyType>) query;
    return result;
}

在调用控制器操作中,我想过滤此列表以查找运行时指定的值;不同调用操作之间要过滤的参数会有所不同。例如。:

List<MyType> FooList = Interface.GetFooList()
    .Where( specific conditions )
    .ToList();

上线设置result,会引发异常:

用户代码未处理无效的强制转换异常

无法转换类型的对象 'System.Data.Entity.Infrastruct.DbQuery'1[f__AnonymousType9'9[System.String,System.Nullable`1[System.DateTime],System.String,System.String,System.String,System.String, System.Int32,System.Nullable'1[System.DateTime],System.Nullable'1[System.DateTime]]]' 输入“System.Linq.IQueryable”1[MyType]”。

所以我认为这是一个铸造问题,并补充说.Cast<MyType>()在致电之前AsQueryable()。这会产生不同的错误:

无法将类型“匿名类型”转换为类型“MyType”。链接到 实体仅支持转换 EDM 基元或枚举类型。

如果我不进行任何转换,这些错误将在调用操作而不是实体框架访问器中引发。

我已经尝试了所有链接的“类似问题”中的建议,但无济于事——错误不断来回出现。我什至尝试过包括.Select(obj => new MyType() {fields...} )摆脱匿名类型。那也没用。

我觉得我错过了一些微妙而明显的东西。

编辑添加

我更新了代码以选择类型:select new MyType() {fields...}。这工作正常。然后调用方法抛出了一个不支持异常,在我过滤结果并从查询中创建列表的行上:

实体或复杂类型“MyType”无法在 LINQ to 实体查询。

ETA2

我将 EF 表属性复制到新类 MyTypeDTO。我用 MyTypeDTO 替换了所有对 MyType 的使用。我收到这个错误:

LINQ to Entities 不支持指定的类型成员“our_id”。仅支持初始值设定项、实体成员和实体导航属性。

这是 DTO 中的属性:

public int our_id { get; set; }

所以我删除了 get/set,重建并重新运行。不,我遇到了同样的错误。


你是对的,你所有的转换都失败的原因是匿名类型(即你用select new {...}构造)无法转换为命名类型。

我什至尝试过包括.Select(obj => new MyType() {fields...} )摆脱匿名类型。那也没用。

你走在正确的轨道上 - 这应该可行,假设MyType有适当的设置者:

 var query = from x in dbContext.TableX
             join y in dbContext.TableY on x.our_id equals y.our_id 
             join z in dbContext.TableZ on y.our_id equals z.our_id 
             join a in dbContext.TableA on z.other_id equals a.other_id 
             where !string.IsNullOrEmpty(x.status)
             select new MyType
             {
                MyTypeField1 = a.Column1
             ,  MyTypeField2 = z.Column3
             ,  // ...and so on
             }; // No need to convert to IQueryable - this should produce the right type
return result;

实体或复杂类型'MyType'无法在 LINQ to Entities 查询中构造。

这是因为MyType是一个映射实体。您不应该创建返回映射实体的投影,因此 EF 正确地限制了您这样做的能力。您应该能够投影到非映射类型(以创建所谓的 DTO - 数据传输对象)。

定义一个类MyTypeDto它具有以下属性MyClass,但没有方法或映射。使用MyClassDto在你的方法的定义中。这应该可以解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试返回 IQueryable 时发生转换错误 的相关文章

随机推荐

  • 如果我使用 Apache::DBI 的 connect_cached(),我应该断开连接吗?

    我的基于 mod perl2 的 Intranet 应用程序使用DBI gt connect cached 据推测被覆盖Apache DBI的版本相同 它通常工作得很好 但就在最近 我们的测试服务器开始出现问题 只有两个用户连接 我们的应用
  • 当我添加 orderBy 应用程序在 firestore 中不起作用时

    onSnapshot 中未捕获的错误 错误 查询需要索引 你 可以在 new FirestoreError index cjs js 352 处创建它 在 JsonProtoSerializer push node modules fire
  • Android ADT版本需要20.0.0及以上

    昨天我尝试安装钛appcelerator 在这个过程中我编辑了一些android sdk安装现在我已经将我的android sdk更新到rev 20 但是当我启动eclipse时我收到一个错误 指出sdk需要20 0 0或更高版本 我尝试使
  • 插入触发器是否需要提交语句

    这是实际场景的简化 在哪里可以看到表 B 上缺失的记录 假设有两个数据库表 A B 表 A 上有一个插入触发器 它对表 B 进行插入 但它没有 COMMIT 如果我们通过 JDBC 连接器打开数据库连接 并对表 A 进行插入 并提交 触发器
  • Discord.py:如何等待用户对 BOT 评论的反应?

    我想制作一个 BOT 根据 BOT 帖子上的用户反应来执行某些操作 像这样的东西https i stack imgur com Vz0dZ jpg https i stack imgur com Vz0dZ jpg 但不是为了投票 只是为了
  • 适用于 iOS 7 AVSpeechSynthesisVoice 的 BCP-47 语音代码有哪些?

    今天我对 iOS 7 中提供的语音合成功能感到非常兴奋 我想选择男声 OSX 中默认为 alex 我不知道他的 BCP 47 代码是什么 顺便说一句 如何获取所有语音代码的完整列表 iOS 8 添加了希伯来语 iOS 9 到 12 中没有添
  • 在 Maven Shade 插件中包含依赖项

    我正在尝试使用 Apache 的 commons lang3 创建一个可部署的 jar 但是 我的 Hadoop 所在的 AWS 集群不包含此库 因此我收到了 classNotFoundException 我想我需要手动添加该依赖项 但我在
  • 如何在 Jupyter 笔记本的 HTML 输出中获取垂直滚动条

    当使用具有 500 行的 Excel 在 Jupyter Notebooks 中运行以下代码时 import pandas as pd pd set option display min rows 50 pd set option disp
  • 如何使用 RGB 元组列表在 PIL 中创建图像?

    假设我有一个像素列表 表示为具有 3 个 RGB 值的元组 列表如下list im getdata 像这样 0 0 0 255 255 255 38 29 58 如何使用这种格式的 RGB 值 每个元组对应一个像素 创建新图像 感谢您的帮助
  • 可以从curl访问docker服务,但不能从postman/chrome访问docker服务

    我正在做 docker 入门指南 https docs docker com get started part3 recap and cheat sheet optional https docs docker com get starte
  • Webpack 和外部库

    我正在尝试 webpack http webpack github io http webpack github io 看起来真的很不错 但我有点被困在这里了 假设我正在为库 f ex jQuery 使用 CDN 然后在我的代码中 我想要r
  • ARM + gcc:不要使用一大块 .rodata 部分

    我想使用 gcc 编译一个程序 并针对 ARM 处理器进行链接时间优化 当我在没有 LTO 的情况下编译时 系统会被编译 当我启用 LTO 时 使用 flto 我收到以下汇编错误 错误 无效的文字常量 池需要更近 环顾网络 我发现这与我系统
  • 挂载 vue 组件 - Vue 3

    我想在 Vue 3 中这样做 new ComponentName propsData title hello world mount 但我收到这个错误 VueComponents component name WEBPACK IMPORTE
  • Azure 表存储和缓存

    是否值得使用 Azure 缓存预览版从 Azure 表存储缓存数据 或者在大型应用程序中表存储是否足够快 Thanks 简短的答案是这取决于 在我当前正在开发的应用程序中 我们使用缓存来处理一些信息来处理从表存储检索数据的延迟并适应每秒所需
  • 为数据提供有效类型是否会产生副作用?

    假设我有一大块动态分配的数据 void allocate size t n void foo malloc n return foo 我希望使用指向的数据foo作为一种特殊类型 type t 但我想稍后再这样做 而不是在分配期间这样做 为了
  • Android Studio:通过命令行安装Release App

    我想从命令行导出 apk 文件 release apk 当我运行这个命令时 gradlew installRelease 我发现了这个 在根项目 中找不到 Android Studio 任务 安装版本 一些候选者是 卸载版本 我该如何解决
  • 如何在 Windows 8 上注册自定义 Win+V 热键?

    可以在 Windows 8 之前的 Windows 版本上注册 Win V 热键 使用此组合的示例应用程序是PureText http www stevemiller net puretext 在 Windows 8 Release Pre
  • IFrame Resizer 未调整大小

    我正在这个页面上工作 http factor1hosting com dnaz wordpress certifications http factor1hosting com dnaz wordpress certifications 我
  • Android 上可靠的重复后台任务

    我正在尝试运行一个后台任务 该任务每分钟左右运行一次 Android 应用程序 但我正在努力确保该任务实际上每分钟运行一次 我尝试了从使用 SystemClock sleep 到 AlarmManager 重复闹钟和固定闹钟 的各种方法 但
  • 尝试返回 IQueryable 时发生转换错误

    我有一个查询应该返回IQueryable