访问实体框架中的存储过程输出参数和结果集?

时间:2012-07-01 16:36:01

标签: sql-server .net-4.0 entity-framework-4.1 output-parameter

是否有任何方法可以从实体框架模型中作为函数导入添加的存储过程访问结果集和输出参数?

我发现如果我将返回类型设置为“None”,那么设计器生成的代码最终调用base.ExecuteFunction(...),我可以在调用函数后很好地访问输出参数(但当然不是结果设定)。

相反,如果我将设计器中的返回类型设置为复杂类型的集合,那么设计器生成代码调用base.ExecuteFunction<T>(...),结果集将返回ObjectResult<T>,然后value ObjectParameter实例的属性为NULL,而不是包含我在Profiler中传回的正确值。

我推测第二种方法可能是调用DataReader而不是关闭它。这是一个已知的问题?任何工作或替代方法?

修改

我的代码目前看起来像

    public IEnumerable<FooBar> GetFooBars(
        int? param1, 
        string param2, 
        DateTime from, 
        DateTime to, 
        out DateTime? createdDate, 
        out DateTime? deletedDate)
    {
        var createdDateParam = new ObjectParameter("CreatedDate", typeof(DateTime));
        var deletedDateParam = new ObjectParameter("DeletedDate", typeof(DateTime));

        var fooBars = MyContext.GetFooBars(param1, param2, from, to, createdDateParam, deletedDateParam);

        createdDate = (DateTime?)(createdDateParam.Value == DBNull.Value ? 
            null : 
            createdDateParam.Value);

        deletedDate = (DateTime?)(deletedDateParam.Value == DBNull.Value ? 
            null : 
            deletedDateParam.Value);

        return fooBars;
    }

1 个答案:

答案 0 :(得分:3)

根据this SO帖子,在迭代结果集之前,sproc实际上并不执行。我模拟了你的场景,运行了一些测试并确认了这种情况。您没有添加代码示例,因此我无法确切地了解您正在做的事情,但根据您在下面的回复,尝试在列表中缓存该结果集(例如,Context.MyEntities.ToList ())然后检查ObjectParameter的值