我正在尝试从具有使用实体框架的办公室信息记录列表的 Oracle 存储过程接收结果,而在我的一生中,我无法使其正常工作。我将 EF6 与 Functions 附加组件一起使用。我已经测试了存储过程。它按预期工作,可由我的 Oracle 用户执行。我得到的最接近的结果是没有返回结果,当我知道我应该得到一些回报时。
我添加了评论以显示我尝试过的不同事物。
此方法调用为过程准备数据。它目前返回 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));
}