EF core 3.1 无法 运行 复杂原始 sql 查询

EF core 3.1 can not run complex raw sql query

以下查询在 EF 核心 2 上运行良好,但 EF 核心 3 会抛出错误! 我什至可以在我现在放手的 EF 核心 2 中的这个查询之后添加一些包含。

查询:

// just to have an Id
var id = Guid.NewGuid();
var resutl = Context.Parties.FromSqlInterpolated($@"WITH mainOffice AS 
             (SELECT * FROM Parties as o1 WHERE (Discriminator = N'Office')
              AND (Id = '{id}') 
              UNION ALL SELECT o.* FROM Parties AS o INNER JOIN mainOffice AS m 
              ON m.Id = o.ParentOfficeId)
              SELECT * FROM mainOffice as f").ToList();

它产生的错误如下:

FromSqlRaw or FromSqlInterpolated was called with non-composable SQL and with a query composing over it. Consider calling AsEnumerable after the FromSqlRaw or FromSqlInterpolated method to perform the composition on the client side.

了解以下信息可能会有所帮助:

我是不是忘记了什么?我究竟做错了什么? 'non-composable SQL' 是什么意思?这是否意味着 EF 核心正在尝试解释查询?

可能相关?

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client

Efcore 2 隐式对无法转换为 sql 的查询部分的对象执行 linq。此功能已在 efcore 3 中删除。

我没有答案,但我现在知道原因了。

产生此错误的原因与此问题类似: FromSql method when used with stored procedure cannot be composed

无论天气与否,我都使用任何方法,因为我尝试查询的 table 包含一些不同的类型(每个层次结构 Table),我的查询将始终在内部扭曲select 查询以限制鉴别器。即使我从根开始编写查询,包装器 select 查询也会生成所有可能的鉴别器。

所以这意味着我只能 运行 可以作为子查询放置的查询。我的查询不能,存储过程不能...

我找到了解决此问题的方法,

您可以在数据库中创建一个视图并在您的模型中创建一个查询类型,然后 运行 您针对该视图的查询(请注意,您这样做的方式已从 ef 2 更改为 3,因为它是解释 here)

所以这样继承和判别器就不再是问题了,查询可以运行。