如何在ASP.NET WebApi / OData项目中使用TypeLess(UnTyped)对象时使用ODataQueryOptions

时间:2015-07-06 22:18:36

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

我一直在指 Asp.net WebApi 2.2 OData 的支持。 WebApi处理大量 OData V4 协议相关的事情非常有趣。

我需要实现一个Odata服务,我没有CLR对象。我在运行时了解了我的类的属性。它就像我有xml文件存储Sql查询。我读了那些xml文件并在其中执行查询。在阅读XML文件后,我意识到了这些列,并希望在OData服务下公开这些信息。

我遇到的挑战是我无法在无类型(非CLR)对象上应用 ODataQueryOptions

示例代码https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataUntypedSample/ReadMe.txt显示了如何从WebApi OData服务公开无类型对象,但它没有显示如何应用ODataQueryOptions。

public class ProductsController : ODataController
  {
    private static IQueryable<IEdmEntityObject> Products = Enumerable.Range(0, 20).Select(i =>
    {
      IEdmEntityType productType = (IEdmEntityType)ODataUntypedModel.Model.FindType("AnalyticsPortal.Product");

      EdmEntityObject product = new EdmEntityObject(productType);
      product.TrySetPropertyValue("Id", i);
      product.TrySetPropertyValue("Name", "Product " + i);
      product.TrySetPropertyValue("Price", i + 0.01);
      product.TrySetPropertyValue("Category", "Category - " + i);

      return product;
    }).AsQueryable();

    ///*
    public EdmEntityObjectCollection Get()
    {


      //return productsContext.Products.AsQueryable();

      var path = Request.ODataProperties().Path;
      var edmType = path.EdmType;
      var collectionType = edmType as IEdmCollectionType;
      var entityType = collectionType.ElementType.Definition as IEdmEntityType;
      var model = Request.ODataProperties().Model;
      var queryContext = new ODataQueryContext(model, entityType, path);
      var queryOptions = new ODataQueryOptions(queryContext, Request);



      //Apply the query option on the IQueryable here.
      //queryOptions
      //How ??
      //queryOptions.ApplyTo() work only on CLR types

      //IQueryable<IEdmEntityObject>

      return new EdmEntityObjectCollection(new EdmCollectionTypeReference(collectionType), Products.ToList());
    }
    //*/
  }

如果有人能指出某种框架或插件可以处理OData查询选项(过滤,选择,订购等等)的方式,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我担心你必须自己申请。如果您公开具体类型的IQueryable(通常通过EF),OData将仅为您应用它们,但如果您没有,那么它不知道如何应用它,因为您可能获取数据来自任何地方!