2参数函数的数据路由



我正在创建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是无效的,因为:

  1. Schedules的集合没有一个名为GetByEntityAndJurisdiction
  2. 绑定函数
  3. 即使GetByEntityAndJurisdiction是绑定函数,您也应该通过其名称空间限定的函数名调用绑定函数。

也许,它是混乱的,你已经建立了以下代码的功能:

var function = builder.Function("GetByEntityAndJurisdiction");
然而,它意味着构建一个未绑定的函数。通过函数导入调用未绑定函数,方法是向标识函数导入的URL发出GET请求,并使用内联参数语法传递参数值。函数导入的规范URL是服务根,后面跟着函数导入的名称。 所以,你可以像下面这样修改你的代码来使它工作:
  1. 如果您想保持模型模式不变,即将GetByEntityAndJurisdiction构建为未绑定函数,请从控制器中删除ODataRoutePrefix("Schedules")]。或者创建一个新控制器(任何控制器),将动作移动到新控制器中,但不添加Prefix属性。

  2. 如果要更改模式而保持控制器不变,则将GetByEntityAndJurisdiction作为绑定函数。

请按以下步骤操作:

var entity = builder.EntitySet<ScheduleDTO>("Schedules").EntityType;
var function = entity.Collection.Function("GetByEntityAndJurisdiction");

关于函数的更多信息,可以参考OData。

最新更新