如何在Odata中提供实用数据?

时间:2014-06-23 09:49:53

标签: c# web-services asp.net-mvc-4 asp.net-web-api odata

我想要一个带有一些实用工具方法的UtilityController来在Microsoft Asp.NET中的Odata Api中提供数据。 目前,如果我想实现一个控制器,它基于某个实体,如Product我将有一个ProductController与EDMModelBuit

  builder.EntitySet<Product>("Product");

如果它们属于Product类型,则为其他类型。

  builder.EntitySet<ProductGroup>("ProductGroup");

现在解决方案是什么?如果我想让UtilityController这样的控制器的方法为GetAnyListGetOfferTypesPutNewEnumTypeInOfferBase,我没有任何实用程序类型等,它只是与任何实体相关的实用数据或可能不是。 e.g

 public class UtilityController : ODataController
{
    private DbContext db = new DbContext();

    public List<string> getOfferBase()
    {
        return UtilityService.GetOfferBase();
    }
    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

然后我可以将此实用程序数据作为

 http://localhost:47120/odata/Utility/getOfferBase

1 个答案:

答案 0 :(得分:1)

未绑定的功能/操作符合您的要求。应用它们,您可以发送此类请求,但不需要实体集:

1. GET http://host/odata/getOfferBase
2. POST http://host/odata/PutNewEnumTypeInOfferBase

要添加未绑定的功能/操作,您需要执行以下操作:

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.Function

ActionConfiguration PutNewEnumTypeInOfferBase = modelBuilder.Action("PutNewEnumTypeInOfferBase");
PutNewEnumTypeInOfferBase .Parameter<string>("Title");
PutNewEnumTypeInOfferBase .ReturnsFromEntitySet<Movie>("Movies");

builder.Function("GetSalesTaxRate")
            .Returns<double>()
            .Parameter<string>("state");

更多信息,请参阅: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataFunctionSample/ https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataActionsSample/