2013-11-26 64 views
0

我新的存儲過程。我創建了以下簡單的存儲過程:存儲過程 - LINQ到實體 - 支持加入(包括()equivelant)

USE db 
GO 
CREATE PROCEDURE dbo.GetSearchResults 
    @BatchId NVARCHAR(20) 
AS 
    SELECT * FROM dbo.SearchResult sr 
    LEFT OUTER JOIN dbo.SearchResultItem sri ON sri.SearchResultID = sr.SearchResultID 
    WHERE sr.BatchID = @BatchId AND (sri.Name = 'sales_rank' OR sri.Name = 'sale_price' OR sri.Name = 'list_price') 
GO 

我目前調用我的C#應用​​此存儲過程如下:

public List<SearchResult> GetSearchResult(string batchId, ModelContainer ctn) 
{ 
    var parameters = new object[] { new SqlParameter("@BatchId", batchId)}; 

    List<SearchResult> searchResults = ctn.ExecuteStoreQuery<SearchResult>("exec GetSearchResults @BatchId", parameters).ToList(); 

    return searchResults; 
} 

這是偉大的,但我唯一的問題是,它不加載SearchResultItem(child)表,我也需要它(請參閱存儲過程中的左外連接)。

在我的EDMX模型中,在函數導入部分,我已經嘗試設置存儲過程返回「複雜」和「實體」的集合。這些都沒有奏效。

誰能提供任何意見?

編輯 - 使用實體框架4.0

回答

1

你想要做的是使用多個SELECT語句的存儲過程中 - 每個實體類型返回,然後用ObjectContext.Translate<T>(...)DbCommand執行獲得的結果DbReader導入結果寫入您的ObjectContxt/DbContext。導航屬性將自動掛鉤。 Read this to get you started

重要提示:由SELECT語句返回的字段必須與實體類恰好

更新的屬性名稱相匹配:由於您使用的EDMX,你可以改變EDMX做進口爲你(鏈接頁面也演示了這一點)