2011-09-02 55 views
0

我有一個存儲過程返回一個表(或數據集或視圖或任何它的調用,它返回的結果select)。我使用實體框架,我期望它通過創建一個實體來將存儲過程像表一樣處理。當我將proc添加到實體模式時,它被添加,但沒有生成類(模式或智能感知中不顯示任何內容)。讀取從存儲過程返回的數據

我不想用這個數據集的解決方案,相貌醜陋和未優化:

SqlCommand sqlCommand = new SqlCommand("sp_ProjetsVoxco"); 
sqlCommand.CommandType = CommandType.StoredProcedure; 
sqlCommand.Connection = new SqlConnection(
    Settings.Default.ConnectionStringTransit); 
SqlDataAdapter sa = new SqlDataAdapter(sqlCommand); 
DataSet dataSet = new DataSet(); 
sa.Fill(dataSet); 

我發現,似乎一條線很整齊:

var x = context.ExecuteStoreQuery<T>("sp_ProjetsVoxco"); 

但由於實體框架沒有生成課程,我不確定如何處理T

+0

你嘗試手動創建實體類(如POCO爲例)? – STO

+0

您是否已經在您的數據庫中創建了存儲過程,或者您嘗試從代碼中完成所有操作? – balexandre

+0

我還沒有手動創建類。存儲過程已經在數據庫 – Mathieu

回答

3

我假設你有你的edmx文件,現在你正試圖添加一個你已經在數據庫中創建的存儲過程。

1 - 您應該添加您的存儲過程,通過使用更新模型從數據庫選項中將其添加到任何其他表中,這將使EF知道SP。 (因爲我已經有我的SP我展示了Refresh標籤,但你會看到你的SP在Add標籤,如果你沒有添加他們還)

enter image description here

2 - 導入功能

enter image description here

3 - 給它一個名字創建一個新的複雜類型

enter image description here

4 - 點擊OK並使用新的方法名

public IEnumerable<mySPMethodCallName_Result> ListAllServiceLogsFromSP(decimal clientId) 
{ 
    var r = from sp in db.sp_ListServiceLogsByClientId(clientId) 
      select sp; 

    return r; 
} 
+0

+1很大的努力。 –

+0

完美地工作。謝謝你們,你做了我的一天。 – Mathieu

4

將存儲過程添加到模型是不夠的。您還必須添加function import。函數導入是將存儲過程映射到上下文中的方法(該方法應該爲您生成)。在此映射中,您可以將結果映射到現有實體,複雜類型或定義新的複雜類型。

ExecuteStoreQuery與導入的存儲過程無關。它用於直接執行SQL(=通常避免EF),並且T必須是您的自定義類型,它具有與您的存儲過程返回的結果集具有相同名稱的公共可設置屬性。