我是存储过程的新手。我创建了以下简单的存储过程:
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(子)表(参见存储过程中的左外连接)。
在我的edmx模型中,在Function Imports部分中,我尝试设置存储过程以返回'Complex'和'Entities'的集合。这些都没有奏效。
有人可以提供任何建议吗?
编辑 - 使用Entity Framework 4.0
答案 0 :(得分:1)
您要做的是在存储过程中使用多个select语句 - 每个实体类型返回一个,然后使用ObjectContext.Translate<T>(...)
DbReader
执行DbCommand
将结果导入ObjectContxt
/ DbContext
。导航属性将自动连接。 Read this to get you started
重要提示:select语句返回的字段必须与实体类的属性名完全匹配
更新:由于您正在使用EDMX,您可以更改EDMX以进行导入(链接页面也会显示此内容)