读取从存储过程返回的数据

时间:2011-09-02 13:10:50

标签: c# entity-framework entity-framework-4

我有一个存储过程返回一个表(或数据集或视图或其调用的任何内容,它返回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

2 个答案:

答案 0 :(得分:4)

向模型添加存储过程是不够的。您还必须添加function import。函数导入是将存储过程映射到上下文中的方法(应该为您生成该方法)。在此映射中,您可以将结果映射到现有实体,复杂类型或定义新的复杂类型。

ExecuteStoreQuery与导入的存储过程无关。它用于直接执行SQL(=主要是避免EF),T必须是您的自定义类型,它具有与存储过程返回的结果集相同名称的公共可设置属性。

答案 1 :(得分:3)

我假设您拥有edmx文件,并且您现在正在尝试添加已在数据库中创建的存储过程。

1 - 您应该通过使用从数据库更新模型选项添加它来添加商店过程,这将使EF了解SP。 (因为我已经有了我的SP,我正在显示Refresh标签,但如果您尚未添加它们,则会在Add标签中看到您的SP。

enter image description here

2 - 导入功能

enter image description here

3 - 为其添加名称并创建新的复杂类型

enter image description here

4 - 点击确定并使用新方法名称

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

    return r;
}