C# ODataV4自定义函数

C# ODataV4自定义函数,c#,asp.net-web-api,odata,asp.net-web-api-odata,C#,Asp.net Web Api,Odata,Asp.net Web Api Odata,我正在尝试在ODataV4WebAPI解决方案中创建一个自定义函数。我需要返回一个基于唯一逻辑的“订单”集合,而OData无法在本地处理该集合。我似乎不知道如何在不破坏整个OData服务层的情况下创建此自定义函数。当我用ODataRoute属性装饰控制器方法时,一切都会陷入地狱。任何基本请求都会产生相同的错误。有没有人能看一下下面的代码,看看你是否注意到我肯定遗漏了什么 WebApiConfig.cs public static class WebApiConfig { public s

我正在尝试在ODataV4WebAPI解决方案中创建一个自定义函数。我需要返回一个基于唯一逻辑的“订单”集合,而OData无法在本地处理该集合。我似乎不知道如何在不破坏整个OData服务层的情况下创建此自定义函数。当我用ODataRoute属性装饰控制器方法时,一切都会陷入地狱。任何基本请求都会产生相同的错误。有没有人能看一下下面的代码,看看你是否注意到我肯定遗漏了什么

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        config.MapODataServiceRoute("odata", "odata", model: GetModel());
    }

    public static Microsoft.OData.Edm.IEdmModel GetModel()
    {
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Account>("Accounts");
        builder.EntitySet<Email>("Emails");
        builder.EntitySet<PhoneNumber>("PhoneNumbers");
        builder.EntitySet<Account>("Accounts");
        builder.EntitySet<Address>("Addresses");
        builder.EntitySet<Order>("Orders");
        builder.EntitySet<OrderDetail>("OrderDetails");

        var orders = builder.EntityType<Order>();
        var function = orders.Function("GetByExternalKey");
        function.Parameter<long>("key");
        function.ReturnsCollectionFromEntitySet<Order>("Orders");

        return builder.GetEdmModel();
     }
 }
public class OrdersController : ODataController
{
    private SomeContext db = new SomeContext();

    ...Other Stuff...

    [HttpGet]
    [ODataRoute("GetByExternalKey(key={key})")]
    public IHttpActionResult GetByExternalKey(long key)
    {
       return Ok(from o in db.Orders
          where //SpecialCrazyStuff is done
          select o);
    }
}
}
当对OData层发出任何请求时,我收到以下错误响应

控制器“Orders”中操作“GetByExternalKey”上的路径模板“GetByExternalKey(key={key})”不是有效的OData路径模板。找不到段“GetByExternalKey”的资源


根据模型生成器,函数GetByExternalKey是一个绑定函数。根据OData协议v4,绑定函数是通过名称空间或别名限定来调用的,因此您需要在route属性中添加更多内容:

[HttpGet]
[ODataRoute("Orders({id})/Your.Namespace.GetByExternalKey(key={key})")]
public IHttpActionResult GetByExternalKey(long key)
{
   return Ok(from o in db.Orders
      where//SpecialCrazyStuff is done
      select o);
}
如果您不知道名称空间,只需将下面的内容添加到方法GetModel():

并用类型顺序的名称空间替换“Your.Namespace”

以下是与您的问题相关的两个示例,仅供参考:


我也有类似的问题。添加自定义函数时,我收到了相同的错误。我能够用自定义函数启动一个干净的项目,它工作得很好,但是在向混合添加一个额外的控制器之后,我会收到上面的错误。在此处找到解决方案和解释:
builder.Namespace = typeof(Order).Namespace;