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.
了解以下信息可能会有所帮助:
- Table "Parties" 是每个层级 table
- 我尝试运行 从根类型 DbSet 和我感兴趣的类型进行查询
- FromSqlRaw 和 FromSqlInterpolated 都没有成功
- 添加 'AsEnumerable' 也没有帮助
我是不是忘记了什么?我究竟做错了什么?
'non-composable SQL' 是什么意思?这是否意味着 EF 核心正在尝试解释查询?
可能相关?
Efcore 2 隐式对无法转换为 sql 的查询部分的对象执行 linq。此功能已在 efcore 3 中删除。
我没有答案,但我现在知道原因了。
产生此错误的原因与此问题类似:
FromSql method when used with stored procedure cannot be composed
无论天气与否,我都使用任何方法,因为我尝试查询的 table 包含一些不同的类型(每个层次结构 Table),我的查询将始终在内部扭曲select 查询以限制鉴别器。即使我从根开始编写查询,包装器 select 查询也会生成所有可能的鉴别器。
所以这意味着我只能 运行 可以作为子查询放置的查询。我的查询不能,存储过程不能...
我找到了解决此问题的方法,
您可以在数据库中创建一个视图并在您的模型中创建一个查询类型,然后 运行 您针对该视图的查询(请注意,您这样做的方式已从 ef 2 更改为 3,因为它是解释 here)
所以这样继承和判别器就不再是问题了,查询可以运行。
以下查询在 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.
了解以下信息可能会有所帮助:
- Table "Parties" 是每个层级 table
- 我尝试运行 从根类型 DbSet 和我感兴趣的类型进行查询
- FromSqlRaw 和 FromSqlInterpolated 都没有成功
- 添加 'AsEnumerable' 也没有帮助
我是不是忘记了什么?我究竟做错了什么? 'non-composable SQL' 是什么意思?这是否意味着 EF 核心正在尝试解释查询?
可能相关?
Efcore 2 隐式对无法转换为 sql 的查询部分的对象执行 linq。此功能已在 efcore 3 中删除。
我没有答案,但我现在知道原因了。
产生此错误的原因与此问题类似: FromSql method when used with stored procedure cannot be composed
无论天气与否,我都使用任何方法,因为我尝试查询的 table 包含一些不同的类型(每个层次结构 Table),我的查询将始终在内部扭曲select 查询以限制鉴别器。即使我从根开始编写查询,包装器 select 查询也会生成所有可能的鉴别器。
所以这意味着我只能 运行 可以作为子查询放置的查询。我的查询不能,存储过程不能...
我找到了解决此问题的方法,
您可以在数据库中创建一个视图并在您的模型中创建一个查询类型,然后 运行 您针对该视图的查询(请注意,您这样做的方式已从 ef 2 更改为 3,因为它是解释 here)
所以这样继承和判别器就不再是问题了,查询可以运行。