存储过程 - Linq到实体 - 支持加入(包括(等效))

时间:2013-11-26 17:29:09

标签: c# linq stored-procedures linq-to-entities

我是存储过程的新手。我创建了以下简单的存储过程:

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

1 个答案:

答案 0 :(得分:1)

您要做的是在存储过程中使用多个select语句 - 每个实体类型返回一个,然后使用ObjectContext.Translate<T>(...) DbReader执行DbCommand将结果导入ObjectContxt / DbContext。导航属性将自动连接。 Read this to get you started

重要提示:select语句返回的字段必须与实体类的属性名完全匹配

更新:由于您正在使用EDMX,您可以更改EDMX以进行导入(链接页面也会显示此内容)