Общее табличное выражение (CTE) в linq-to-sql? - PullRequest
31 голосов
/ 25 февраля 2009

Можно ли сделать общие табличные выражения (CTE) (как показано ниже) в Linq to SQL. Я довольно новичок в CTE, а также в Linq to SQL.

В настоящее время я храню Proc бесплатно (но ни в коем случае не против них), поэтому я не хочу переходить к хранимым процессам только для одного запроса, если только это не является абсолютно необходимым.

Вот пример того, что я делаю в 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 Ответ

19 голосов
/ 25 февраля 2009

AFAIK, это не поддерживается объектной моделью. Однако LINQ поддерживает метод для выполнения запроса (достаточно странно, который называется DataContext.ExecuteQuery). Похоже, вы можете использовать это для вызова произвольного фрагмента SQL и отображения его обратно в LINQ. Вы не будете свободны от SQL из-за встроенного SQL, но вам не придется использовать sproc.

Как: напрямую выполнять запросы SQL (LINQ to SQL)

...