2012-06-06 30 views
0

我有使用CTE編寫的SQL查詢。現在,我移動在倉庫使用實體框架5.如何在實體框架中集成CTE查詢5

我在一個不知如何使用實體框架5.

我使用POCO實體整合(或重寫)基於CTE查詢與EF5和有一堆地圖類。沒有EDMX文件等。

我現在感覺像一個總noobot,並希望任何幫助指出我在正確的方向。

的CTE查詢如下

WITH CDE AS 
(
    SELECT * FROM collaboration.Workspace AS W WHERE W.Id = @WorkspaceId 
    UNION ALL 
    SELECT W.* FROM collaboration.Workspace AS W INNER JOIN CDE ON W.ParentId = CDE.Id AND W.ParentId <> '00000000-0000-0000-0000-000000000000' 
) 
SELECT 
    W.Id AS Id, 
    W.Name AS Name, 
    W.Description AS Description, 
    MAX(WH.ActionedTimeUtc) AS LastUpdatedTimeUtc, 
    WH.ActorId AS LastUpdateUserId 
FROM 
    collaboration.Workspace AS W 
    INNER JOIN 
    collaboration.WorkspaceHistory AS WH ON W.Id = WH.WorkspaceId 
    INNER JOIN 
    (
     SELECT TOP 10 
      CDE.Id 
     FROM 
      CDE 
      INNER JOIN 
      collaboration.WorkspaceHistory AS WH ON WH.WorkspaceId = CDE.Id 
     WHERE 
      CDE.Id <> @WorkspaceId 
     GROUP BY 
      CDE.Id, 
      CDE.ParentId, 
      WH.ActorId, 
      WH.Action 
     HAVING 
      WH.ActorId = @UserId 
      AND 
      WH.Action <> 4 
     ORDER BY 
      COUNT(*) DESC 
    ) AS Q ON Q.Id = WH.WorkspaceId 
GROUP BY 
    W.Id, 
    W.Name, 
    W.Description, 
    WH.ActorId 
HAVING 
    WH.ActorId = @UserId 

回答

5

您必須創建存儲過程爲您的SQL查詢(或直接使用該查詢),並通過dbContext.Database.SqlQuery執行它。您在沒有任何其他選項的情況下使用代碼優先的方法。在EDMX中,您可以使用映射的表值函數,但代碼優先尚未具有此類選項。

+1

由於拉吉斯拉夫這需要ID的數組作爲輸入參數和返回數據表。這就是我最終做的。我對創建返回結果的新實體抱有雙重心願。你有什麼想法嗎? –

+0

或者是複雜類型用於什麼? –

+2

您不需要映射任何實體或複雜類型。只需在結果集中使用與列名稱相同的屬性創建類,並將其用作'SqlQuery'的通用參數。 –