2009-02-25 8 views
26

Est-il possible de faire des expressions de table communes (CTE) (comme illustré ci-dessous) dans Linq to SQL. Je suis assez nouveau pour CTE ainsi que Linq to SQL.Expression de table commune (CTE) dans linq-to-sql?

Je suis actuellement stocké Proc gratuit (mais pas contre eux par tous les moyens), donc je ne veux pas faire le saut à procs stocké juste pour une requête, sauf si c'est totalement nécessaire.

Voici un exemple de ce que je fais dans SQL que je me demande si je peux le faire dans 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] 

Répondre

17

AFAIK, ce ne sont pas pris en charge par le modèle d'objet. Toutefois, LINQ prend en charge une méthode pour exécuter une requête (assez étrangement appelée DataContext.ExecuteQuery). On dirait que vous pouvez utiliser cela pour appeler un morceau arbitraire de SQL et l'associer à LINQ. Vous ne serez pas libre de SQL à cause du SQL embarqué, mais vous n'aurez pas besoin d'utiliser un sproc.

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

Questions connexes