实体框架中的 CTE Sql 查询支持 <DefiningQuery>

Posted

技术标签:

【中文标题】实体框架中的 CTE Sql 查询支持 <DefiningQuery>【英文标题】:CTE Sql query support in Entity Framework <DefiningQuery> 【发布时间】:2011-06-03 18:22:31 【问题描述】:

实体框架能否支持在

中使用 CTE/行号的 SQL 查询
<DefiningQuery> </DefiningQuery>

.edmx 文件的属性?

这是关于在这篇文章中给我的一个使用此类功能的查询:Complex / Algorithmic SQL Query

我从 sql 中得到以下 InnerException:

Incorrect syntax near the keyword 'with'.
Incorrect syntax near the keyword 'with'. If this statement is a common table ex
pression, an xmlnamespaces clause or a change tracking context clause, the previ
ous statement must be terminated with a semicolon.
Incorrect syntax near ','.
Incorrect syntax near ','.
Incorrect syntax near ')'.

在开头的“with”语句之前添加分号并不能解决问题。它说';'附近的语法不正确在这种情况下。

如果不支持,我想我可以将存储过程绑定到复杂实体,但还有其他选择吗?

谢谢。

【问题讨论】:

您尝试使用 CTE 是否有原因?我不知道您决定这一点所经历的一切,但 EF(以及整个 ORM)的重点是将数据库抽象到您不必担心特定数据库实现的地方。话虽这么说,我敢肯定有一些操作是 EF 本身不会处理的,你可能需要一个 CTE,在这种情况下,我会按照你的建议做,让 EF 调用一个存储过程(假设它可以) . 出于好奇。我有一些自定义实体,它们使用实体框架的 DefiningQuery 功能组合来自多个表的数据。还有一个简单的算法,我用来从数据库中的登录和注销条目计算用户会话的长度。另一张海报为我提供了一个非常复杂的 SQL 查询,该查询实际上完全由它自己完成。如果我创建了一个自定义 EntityType 并将其用作其定义查询,我可以非常简单地查询数据库中的这些会话。 This answer? 你可以把整个事情放到一个视图中。例如CREATE VIEW yourview AS with events as ...and i.row=o.row这会让事情变得更容易吗? 据我了解,本质上,DefiningQuery 是客户端视图。所以是的,我可以在数据库中创建一个视图。不过,我不确定 EF 中的自定义 EntityType 究竟如何与之相关。 【参考方案1】:

这篇文章没有说明 CTE 是递归的还是非递归的。使用递归 CTE 可能有令人信服的性能原因,这可能超过抽象数据库的愿望(即使用 EF 作为 ORM)。

在 Entity Framework 4 中,Martin 在上面提到了使用视图的解决方法。这篇来自 Matthieu Mezil (http://msmvps.com/blogs/matthieu/archive/2010/06/16/how-to-include-recursion-table-valued-functions-in-linq-to-entities-queries-with-ef4.aspx) 的博文 有一些关于如何做到这一点的详细信息。

【讨论】:

以上是关于实体框架中的 CTE Sql 查询支持 <DefiningQuery>的主要内容,如果未能解决你的问题,请参考以下文章

Presto SQL 是不是像 SQL Server 一样支持使用 CTE 进行递归查询?例如员工等级

sql server 公共表达式(CTE)的简单应用

锚和递归查询“CTE”列“ColumnName”中的递归部分之间的类型不匹配

sql server使用cte递归查询获取树形的父节点/子节点

CTE 中的 SQL Server 视图导致性能不佳

SQL中使用WITH 语句的查询