我正在创建OData控制器,希望它支持2个参数的函数。这是我当前的代码。
OData cofig:
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.Namespace = "hop";
builder.EntitySet<ScheduleDTO>("Schedules");
var function = builder.Function("GetByEntityAndJurisdiction");
function.Parameter<Guid>("EntityId");
function.Parameter<Guid>("JurisdictionId");
function.ReturnsCollectionFromEntitySet<ScheduleDTO>("Schedules");
控制器:
[ODataRoutePrefix("Schedules")]
public class ScheduleODataController : BaseODataManager, IScheduleODataManager
{
[ODataRoute]
public async Task<IHttpActionResult> GetAsync(ODataQueryOptions<ScheduleDTO> options)
{
.....
return Ok(schedules.Select(x => Mapper.Map<ScheduleDTO>(x)));
}
[HttpGet]
[ODataRoute("GetByEntityAndJurisdiction(EntityId={entityId}, JurisdictionId={jurisdictionId})")]
public async Task<IHttpActionResult> GetByEntityAndJurisdiction(ODataQueryOptions<ScheduleDTO> options, [FromODataUri] Guid entityId, [FromODataUri] Guid jurisdictionId)
{
.....
return Ok(schedules.Select(x => Mapper.Map<ScheduleDTO>(x)));
}
}
启动我的应用,我有以下错误:
类型为'System '的第一次异常。InvalidOperationException' occurred in System.Web.OData.dll
附加信息:路径模板'Schedules/GetByEntityAndJurisdiction(EntityId={EntityId}, JurisdictionId={JurisdictionId})'上的动作'GetByEntityAndJurisdiction'在控制器'ScheduleOData'不是一个有效的OData路径模板。请求URI无效。由于段'Schedules'指的是一个集合,因此它必须是请求URI中的最后一个段,或者必须后跟一个可以绑定到它的函数或操作,否则所有中间段都必须引用单个资源。
如何解决这个问题?提前感谢。
@Vladimir
在控制器中,在控制器上添加前缀属性[ODataRoutePrefix("Schedules")]
。这样做将在同一控制器中的所有[ODataRoute]的头部添加前缀字符串。因此,对于下面的
public async Task<IHttpActionResult> GetByEntityAndJurisdiction(ODataQueryOptions<ScheduleDTO> options, [FromODataUri] Guid entityId, [FromODataUri] Guid jurisdictionId)
{...}
完整的Uri模板应该是:
Schedules/GetByEntityAndJurisdiction(EntityId={entityId}, JurisdictionId={jurisdictionId})
显然,这个Uri是无效的,因为:
-
Schedules
的集合没有一个名为GetByEntityAndJurisdiction
的绑定函数 - 即使
GetByEntityAndJurisdiction
是绑定函数,您也应该通过其名称空间限定的函数名调用绑定函数。
也许,它是混乱的,你已经建立了以下代码的功能:
var function = builder.Function("GetByEntityAndJurisdiction");
然而,它意味着构建一个未绑定的函数。通过函数导入调用未绑定函数,方法是向标识函数导入的URL发出GET请求,并使用内联参数语法传递参数值。函数导入的规范URL是服务根,后面跟着函数导入的名称。 所以,你可以像下面这样修改你的代码来使它工作:
如果您想保持模型模式不变,即将
GetByEntityAndJurisdiction
构建为未绑定函数,请从控制器中删除ODataRoutePrefix("Schedules")]。或者创建一个新控制器(任何控制器),将动作移动到新控制器中,但不添加Prefix属性。如果要更改模式而保持控制器不变,则将
GetByEntityAndJurisdiction
作为绑定函数。
请按以下步骤操作:
var entity = builder.EntitySet<ScheduleDTO>("Schedules").EntityType;
var function = entity.Collection.Function("GetByEntityAndJurisdiction");
…
关于函数的更多信息,可以参考OData。