使用Entity Framework返回oracle引用游标

时间:2017-08-16 13:10:42

标签: c# oracle entity-framework-6 sys-refcursor entity-functions

我试图从使用Entity Framework获取办公室信息记录列表的Oracle存储过程中获取结果,并且在我的生命中,我无法使其正常工作。我使用EF6和函数附加组件。我测试了存储过程。它正在按预期工作并由我的Oracle用户执行。我得到的最接近的结果是没有结果,当我知道我应该回来的时候。

我添加了评论,以展示我尝试的不同内容。

此方法调用preps过程的数据。它此时返回null,因此我可以验证结果列表。

public ObjectResult<OfficeLocation> SP_GET_OFFICE_LIST(int radius, double latitude, double longitude)
    {
        var latdec = Convert.ToDecimal(latitude);
        var longdec = Convert.ToDecimal(longitude);
        try
        {
            var radiusParameter = new ObjectParameter("v_radius", radius);
            var latitudeParameter = new ObjectParameter("v_latitude", latdec);
            var longitudeParameter = new ObjectParameter("v_longitude", longdec);
            var officeList = new List<OfficeLocation>();

            //Did not work and returns 0 results
            //var output = new AgentInfoEntities().ObjectContext().ExecuteFunction<OfficeLocation>("SP_GET_OFFICE_LIST", latitudeParameter, longitudeParameter, radiusParameter);
            //Tried calling the function directly
            var output2 = OracleFunctions.SP_GET_OFFICE_LIST(latdec, longdec, radius);

            return null;
        }
        catch (Exception e)
        {
            Log.Error("**** Exception: " + e);
            throw e;
        }
    }

此函数调用过程

public static class OracleFunctions
{
    [Function(FunctionType.StoredProcedure, nameof(SP_GET_OFFICE_LIST), Schema = "schema_name")]
    public static IQueryable<OfficeLocation> SP_GET_OFFICE_LIST(decimal latitude, decimal longitude, int radius)
    {
        var parameters = new List<ObjectParameter>(3);

            parameters.Add(new ObjectParameter("v_latitude", latitude));
            parameters.Add(new ObjectParameter("v_longitude", longitude));
            parameters.Add(new ObjectParameter("v_radius", radius));

            //Try by passing parameters as an array
            return new AgentInfoEntities().ObjectContext()
                .CreateQuery<OfficeLocation>("[SP_GET_OFFICE_LIST](@v_latitude, @v_longitude, @v_radius)",
                    parameters.ToArray());
    }
}

在继承自DbContext

的AgentInfoEntities类中
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions)));
        modelBuilder.ComplexType<OfficeLocation>();
        modelBuilder.AddFunctions(typeof(OracleFunctions));
}

0 个答案:

没有答案