linq-to-sql中的公用表表达式(CTE)?

时间:2009-02-25 05:44:37

标签: linq-to-sql common-table-expression

是否可以在Linq to SQL中执行公用表表达式(CTE)(如下所示)。我对CTE和Linq to SQL都很陌生。

我目前正在免费存储过程(但不能以任何方式对抗它们)所以我不想仅仅针对一个查询进行存储过程的跳跃,除非它是完全必要的。

以下是我在SQL中所做的一个示例,我想知道我是否可以在Linq to SQL中执行:

WITH TaskHierarchy (TaskID, [Subject], ParentID, HierarchyLevel, HierarchyPath) AS
(
   -- Base case
   SELECT
      TaskID,
      [Subject],
      ParentID,
      1 as HierarchyLevel,
      CONVERT(VARCHAR(MAX),'/') AS HierarchyPath
   FROM Task
   WHERE TaskID = 2

   UNION ALL

   -- Recursive step
   SELECT
      t.TaskID,
      t.Subject,
      t.ParentID,
      th.HierarchyLevel + 1 AS HierarchyLevel,
      CONVERT(varchar(MAX),th.HierarchyPath + CONVERT(VARCHAR(32),t.ParentID) + '/') AS HierarchyPath
   FROM Task t
      INNER JOIN TaskHierarchy th ON
         t.ParentID = th.TaskID
)

SELECT *
FROM TaskHierarchy
ORDER BY HierarchyLevel, [Subject]

1 个答案:

答案 0 :(得分:19)

AFAIK,对象模型不支持此功能。但是,LINQ支持一种执行查询的方法(足够严格地称为DataContext.ExecuteQuery)。看起来你可以使用它来调用任意一段SQL并将其映射回LINQ。由于嵌入式SQL,您将不再是SQL,但您不必使用sproc。

How to: Directly Execute SQL Queries (LINQ to SQL)