首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EFCore 3.1 FromSqlRaw无法工作并抛出一条奇怪的错误消息

问EFCore 3.1 FromSqlRaw无法工作并抛出一条奇怪的错误消息
EN

Stack Overflow用户
提问于 2020-06-03 23:05:28
回答 1查看 4.4K关注 0票数 2

我有一个最奇怪的问题与EF核心3.1。在EFCore2.2中,我曾经能够执行存储过程。我看到文档中发生了急剧的变化,但是,我正在准确地跟踪文档,而且它不起作用。我在返回的数据中任何地方都没有空。NoticeOfInspection对象与返回的数据完全匹配。他们到底改变了什么,这是不起作用的?

代码语言:javascript
复制
var data = _dbContext.NoticeOfInspections.FromSqlRaw("EXEC dbo.NewReportApp_NoticeOfInspection {0}", FacilityId).Single();

错误消息根本没有帮助。首先使用上面的行,上面写着:"InvalidOperationException: FromSqlRaw或FromSqlInterpolated是用不可组合的SQL调用的,并具有在其上组成的查询。考虑在FromSqlRaw或FromSqlInterpolated方法之后调用AsEnumerable,以便在客户端执行组合。“

什么?

因此,我添加AsEnumerable,然后它抛出,"InvalidCastException:无法将'System.Int32‘类型的对象强制转换为’System.String‘。“

他们到底做了什么。这完全不是直觉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 23:39:42

使用不可组合的SQL调用FromSqlRaw或FromSqlInterpolated。

不可组合的SQL是不能转换为子查询select * from (your_sql)的.调用SP (EXEC …)是不可组合结构之一.

并且有一个对它的查询

非查询返回LINQ操作符(如Single、First、Count、Max、Sum等)需要在提供的SQL查询(例如select count * from (your_query) )上进行组合。

您可以在原始SQL查询-使用LINQ进行组合文档主题中阅读更多有关它的内容,该主题还包含“调用SP”和其他限制/限制:

使用LINQ进行组合要求您的原始SQL查询是可组合的,因为EF Core将将提供的SQL视为子查询。可以用SELECT关键字开始组成的SQL查询。此外,传递的SQL不应包含在子查询上无效的任何字符或选项,例如:

  • 尾随分号
  • 在Server上,尾随的查询级别提示(例如,OPTION (HASH JOIN)) )
  • 在Server上,不与ORDER BY子句中的OFFSET 0或TOP 100 PERCENT一起使用的SELECT子句

Server不允许对存储过程调用进行组合,因此对此类调用应用其他查询运算符的任何尝试都将导致无效的SQL。在AsEnumerable或FromSqlInterpolated方法之后使用FromSqlRaw或AsAsyncEnumerable方法,以确保stored不会试图对存储过程进行组合。

这么说,在AsEnumerable()之前插入Single()应该是有效的。

您得到的新异常要么是EF,要么是数据类型映射问题(要么将int传递给string参数,要么SP返回string类属性的int )。您需要检查异常堆栈跟踪和/或将SP参数和列类型与FacilityId参数类型和NoticeOfInspection类属性类型/映射进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62184175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档