我最担心EF Core 3.1的问题。在EF Core 2.2中,我曾经能够执行存储过程。我看到文档中有一个重大更改,但是我正在完全遵循文档,因此无法正常工作。我在返回的数据中的任何地方都没有null。 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'的情况。”
他们在地球上做了什么。这一点都不直观。
答案 0 :(得分:0)
FromSqlRaw或FromSqlInterpolated是使用不可组合的SQL调用的
不可组合的SQL是不能转换为子查询select * from (your_sql)
的SQL。调用SP(EXEC …
)是不可组合的构造之一。
,并有一个组成查询的查询
非查询返回的LINQ运算符,例如Single
,First
,Count
,Max
,Sum
等,例如,需要在提供的SQL查询上进行组合select count * from (your_query)
。
您可以在Raw SQL queries - Composing with LINQ文档主题中了解有关此主题的更多信息,该主题还包含“调用SP”和其他限制/限制:
使用LINQ进行编写要求您的原始SQL查询必须是可组合的,因为EF Core会将提供的SQL视为子查询。可以组成的SQL查询以
SELECT
关键字开头。此外,传递的SQL不应包含对子查询无效的任何字符或选项,例如:
- 尾部分号
- 在SQL Server上,尾随查询级提示(例如
OPTION (HASH JOIN))
- 在SQL Server上,未与
ORDER BY
子句中的OFFSET 0
或TOP 100 PERCENT
一起使用的SELECT
子句SQL Server不允许通过存储过程调用进行组合,因此,任何将附加查询运算符应用于此类调用的尝试都将导致无效的SQL。在
AsEnumerable
或AsAsyncEnumerable
方法之后立即使用FromSqlRaw
或FromSqlInterpolated
方法,以确保EF Core不会尝试对存储过程进行组合。
话虽如此,在AsEnumerable()
之前插入Single()
应该确实有效。
您遇到的新异常是EF Core错误或数据类型映射问题(您正在将int
传递给string
参数,或者SP为{{1 }}类属性)。您需要检查异常堆栈跟踪和/或将SP参数和列类型与int
参数类型和string
类属性类型/映射进行比较。