我指的是Asp.net WebApi 2.2对OData的支持。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查询选项(筛选、选择、订购等),我会很感激。
发布于 2015-07-07 07:53:48
恐怕你必须亲自运用它们。只有当您公开一个具体类型的IQueryable (通常通过EF)时,它才会为您应用它们,但是如果您没有这种类型,那么它将不知道如何应用它,因为您可以从任何地方获取数据!
https://stackoverflow.com/questions/31256631
复制相似问题