Asp.net mvc ODataWebAPI路由

Asp.net mvc ODataWebAPI路由,asp.net-mvc,wcf,odata,asp.net-mvc-routing,Asp.net Mvc,Wcf,Odata,Asp.net Mvc Routing,我有一个web API从SQL存储过程中公开ODATA。我想使用像/odata/firmhierarchy(225)这样的url将225传递到存储过程的参数中。它只是告诉我它找不到匹配的资源。它击中了控制器,只是跳过了方法。想法 在webapiconfig中 private static IEdmModel GenerateEdmModel() { var builder = new ODataConventionModelBuilder();

我有一个web API从SQL存储过程中公开ODATA。我想使用像/odata/firmhierarchy(225)这样的url将225传递到存储过程的参数中。它只是告诉我它找不到匹配的资源。它击中了控制器,只是跳过了方法。想法

在webapiconfig中

        private static IEdmModel GenerateEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Employee>("Employees");
        builder.EntitySet<Employee>("FirmHierarchy");

        return builder.GetEdmModel();
    }
private静态IEdmModel generateedmodel()
{
var builder=新的ODataConventionModelBuilder();
建筑商实体集(“员工”);
builder.EntitySet(“FirmHierarchy”);
返回builder.GetEdmModel();
}
背景:

    public virtual ObjectResult<Employee> sp_EmployeeHierarchy(Nullable<int> managerEmpID)
    {
        var managerEmpIDParameter = managerEmpID.HasValue ?
            new SqlParameter("ManagerEmpID", managerEmpID) :
            new SqlParameter("ManagerEmpID", 0);

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<Employee>("sp_EmployeeHierarchy @ManagerEmpID", managerEmpIDParameter);
    }
public虚拟对象结果sp_EmployeeHierarchy(可为null的managerEmpID)
{
var managerEmpID参数=managerEmpID.HasValue?
新的SqlParameter(“ManagerEmpID”,ManagerEmpID):
新的SqlParameter(“ManagerEmpID”,0);
返回((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery(“sp_EmployeeHierarchy@ManagerEmpID”,managerEmpIDParameter);
}
控制器中的唯一方法:

    [Queryable]
    public IQueryable<Employee> GetFirmHierarchy()
    {
        return db.sp_EmployeeHierarchy(225).AsQueryable();
        //return SingleResult.Create(db.Employees.Where(employee => employee.EmpId == key));
    }
[EnableQuery]
public IQueryable<Employee> Get([FromODataUri] int key)
{
    return db.sp_EmployeeHierarchy(key).AsQueryable();
}
[可查询]
公共IQueryable GetFirmHierarchy()
{
返回db.sp_EmployeeHierarchy(225).AsQueryable();
//返回SingleResult.Create(db.Employees.Where(employee=>employee.EmpId==key));
}
这应该可以:

1.在控制器中编写另一种方法:

    [Queryable]
    public IQueryable<Employee> GetFirmHierarchy()
    {
        return db.sp_EmployeeHierarchy(225).AsQueryable();
        //return SingleResult.Create(db.Employees.Where(employee => employee.EmpId == key));
    }
[EnableQuery]
public IQueryable<Employee> Get([FromODataUri] int key)
{
    return db.sp_EmployeeHierarchy(key).AsQueryable();
}

当从实体框架自动生成ODATA时,我能够使ODATA为表工作。但是,该生成过程不希望用于表值函数返回的复杂类型(类似于SP的场景),因为它似乎不知道键在哪里

但我发现,无论如何,我可以让它工作。首先,我看看这个。他更加手动地进行设置,在公司处理控制器上的Get将id 3的路由设置为“公司处理(3)”

这让我很惊讶。我的其他生成的类设置了这样一种模式,SomeEntity变成了SomeEntityController,使用了诸如GetSomeEntities之类的方法,以及一个在我看来与方法匹配但删除了get这个词的路由。因此,从Get方法名称中删除实体名称似乎有所不同,但它确实有效。证明路径实际上与控制器名称匹配,而不是与方法名称匹配

在这种情况下,可以使用要查询的数据类型和控制器名称的开头来配置路由。然后,实际路径也使用控制器名称的开头

然后所有这些基本上把我们带到另一个发布的解决方案,假设您的控制器名称是firmhierarchycontroller

所以,现在,弄明白这一点。。。尝试转到$metadata,您的端口可能不同。您会注意到ODATA公开了一个数据类型,该数据类型通过数据集访问。当客户机试图查询ODATA时,他们正试图查询数据集,获取数据类型的项


与控制器名称(较少的控制器)匹配的数据集和Get方法实际上可以在不进一步扩展名称的情况下直接获取,否则在这种情况下会给我带来问题。

您不能将225从请求URL传递到控制器方法是您的问题吗?是的,这是我的问题。我跳伞,把桌子夷为平地,然后就这样做了。但我想知道我如何调用sp,使用param…通过odata传递它。