我有一个最奇怪的问题与EF核心3.1。在EFCore2.2中,我曾经能够执行存储过程。我看到文档中发生了急剧的变化,但是,我正在准确地跟踪文档,而且它不起作用。我在返回的数据中任何地方都没有空。NoticeOfInspection对象与返回的数据完全匹配。他们到底改变了什么,这是不起作用的?
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‘。“
他们到底做了什么。这完全不是直觉。
发布于 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不应包含在子查询上无效的任何字符或选项,例如:
OPTION (HASH JOIN)) )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类属性类型/映射进行比较。
https://stackoverflow.com/questions/62184175
复制相似问题