2009-02-25 16 views
26

Czy można wykonywać typowe wyrażenia tabelowe (CTE) (jak pokazano poniżej) w Linq do SQL. Jestem całkiem nowy w CTE, a także w Linq w SQL.Common Table Expression (CTE) w linq-sql?

Obecnie jestem przechowywany Proc za darmo (ale nie przeciwko nim w żaden sposób), więc nie chcę przeskoczyć do przechowywanych proców tylko dla jednego zapytania, chyba że jest to absolutnie konieczne.

Oto przykład tego, co robię w SQL, że zastanawiam się, czy mogę zrobić w LINQ do 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] 

Odpowiedz

17

AFAIK, to nie jest obsługiwana przez model obiektu. Jednak LINQ obsługuje metodę wykonania zapytania (o dziwo nazywa się DataContext.ExecuteQuery). Wygląda na to, że możesz użyć tego do wywołania dowolnego fragmentu SQL i odwzorowania go z powrotem na LINQ. Nie będziesz SQL wolny z powodu wbudowanego SQL, ale nie będziesz musiał używać sproc.

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