2011-08-18 44 views
2

我有一個項目首先使用實體​​框架代碼。如何在EF代碼優先的存儲過程中填充包含子集合的模型

由於各種原因,其中一個linq查詢不能很好地執行,我想用存儲過程調用替換它。

以下代碼適用於調用存儲過程並將結果轉換爲List。

IEnumerable<Activity> activities = 
    ((IObjectContextAdapter)MyContext) 
     .ObjectContext.ExecuteStoreQuery<Activity>("GetActivities").ToList(); 

但是我還希望在活動模型上包含一些包含該對象的子集合之一。例如,Activity有一個虛擬列表集合。有沒有一種方法可以在我的存儲過程中返回每個活動的標籤。

如果我下面的C#說,它不是一個有效的活性不起作用

SELECT 
    Activities.ID, 
    Activities.Name, 
    Tags.ID, 
    Tags.Name 
FROM 
    Activities 
    LEFT JOIN ActivityTags ON ActivityTags.ActivityID = Activities.ID 
    LEFT JOIN Tags ON Tags.ID = ActivityTags.TagID 

它的錯誤。如果我從存儲過程中刪除標籤位,所以只需從Activities表中選擇它就可以正常工作。

我不知道我問的是否可能與存儲過程使用實體框架或不。如果沒有,我可能不得不求助於使用SqlCommand並從我的結果集中構建模型。

回答

2

這是不可能的。自動實體人口僅適用於平面對象=您可以填充Activity,但不能填充它的關係。如果要加載關係,則必須使用標準的ADO.NET,但在這種情況下,最好修改存儲過程以返回每個表的單獨結果集,以減少傳輸的數據量。

+0

多數民衆贊成什麼,我在想如果我去的ADO.Net路線我打算讓存儲過程首先返回平面活動的結果集,然後結果集的平面標籤,並使用C#將它們拼合在一起。聽上去怎麼樣? – Gavin

+0

您還需要從交界處獲得結果集以瞭解如何將它們拼合在一起,不是嗎? –

+0

嗯,我可能只是將活動ID添加到每個標記記錄返回保存返回額外的結果集,但它聽起來像我們想在同一行。謝謝 – Gavin