首页 > 解决方案 > EF core 3.1 无法运行复杂的原始 sql 查询

问题描述

以下查询在 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 或 FromSqlInterpolated 是使用不可组合的 SQL 调用的,并使用在其上构成的查询。考虑AsEnumerable 在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用以在客户端执行组合。

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

我忘了什么吗?我究竟做错了什么?“不可组合的 SQL”是什么意思?这是否意味着 EF 核心正在尝试解释查询?

标签: sqlef-core-3.1

解决方案


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

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

在我的情况下,无论天气与否,我都使用任何方法,因为我试图查询的表包含一些不同的类型(每个层次结构的表),我的查询将始终在选择查询中被扭曲以限制鉴别器。即使我从根编写查询,包装器选择查询也是使用所有可能的鉴别器生成的。

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


推荐阅读