【问题标题】:How to use ODataQueryOptions in case of TypeLess (UnTyped) object in ASP.NET WebApi / OData project如何在 ASP.NET WebApi / OData 项目中的 TypeLess (UnTyped) 对象的情况下使用 ODataQueryOptions
【发布时间】:2015-09-24 05:40:26
【问题描述】:

我一直在提到 Asp.net WebApi 2.2OData 的支持。 WebApi 处理很多 OData V4 协议相关的事情是非常有趣的。

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

我一直面临的挑战是我无法将 ODataQueryOptions 应用于 无类型(非 CLR) 对象。

示例代码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 查询选项(过滤器、选择、排序等)的方式,我将不胜感激

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我目前面临同样的问题。
  • @Arun 不幸的是没有。我使用 WCF(数据服务)项目来实现上述要求。

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


【解决方案1】:

恐怕您必须自己应用它们。如果您公开具体类型的 IQueryable(通常通过 EF),OData 只会为您应用它们,但如果您没有它,那么它将不知道如何应用它,因为您可以从任何地方获取数据!

【讨论】:

  • 您的回复与我收集的信息类似。但是,我认为从任何地方获取数据都不是问题。我可以从 sql 查询中获取我的数据并构建一个 IQueryable。问题是 ODataQueryOptions 仅适用于 CLR 类型
  • 我以为您正在尝试在数据库级别应用过滤器。我是否认为您正在返回一个列表并且您希望 OData 对其进行后过滤?如果是这样,您可以从您的控制器中发布代码吗?
  • 嗨,Tom,我在原始问题本身中添加了代码。
  • 如果在方法中添加 [EnableQuery] 属性会发生什么?
  • 我不能,因为我没有返回 IQueryable。如果我返回 IQueryable 然后我得到异常说 Odataformatter 不知道如何序列化......正如我的问题中提到的那样。示例代码位于aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2013-01-01
  • 2013-11-26
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多