.Net Core OData支持对单个实体集进行过滤

时间:2018-03-25 16:18:39

标签: c# asp.net-core .net-core odata asp.net-core-webapi

我在.Net Core上运行OData的Beta版。我试图仅根据控制器启用odata的某些功能。我的启动课看起来像这样:

services.AddOData();   
//...

app.UseMvc(routeBuilder =>
{
    //routeBuilder.Count().Filter().OrderBy().Expand().Select().MaxTop(null);
    routeBuilder.MapODataServiceRoute("odata", null, GetModel());
    routeBuilder.EnableDependencyInjection();
});

public static IEdmModel GetModel()
{
    var builder = new ODataConventionModelBuilder();
    var skillSet = builder.EntitySet<Skill>(nameof(Skill));
    skillSet.EntityType.Count().Filter().OrderBy().Expand().Select();
    builder.Namespace = "ODataTest.Models";
    builder.ContainerName = "DefaultContainer";

    return builder.GetEdmModel();
}

当我全球启用odata时,一切正常。但是,我无法公开我的所有实体

routeBuilder.Count().Filter().OrderBy().Expand().Select().MaxTop(null);

但是,当我尝试为特定实体集启用odata时,我在尝试过滤时遇到错误

skillSet.EntityType.Count().Filter().OrderBy().Expand().Select();
  

URI中指定的查询无效。该物业名称&#39;不能在$ filter查询选项中使用。

为了完整起见,这是我的控制器:

[HttpGet]
[EnableQuery]
public async Task<Skill[]> GetFilteredODataList(ODataQueryOptions<Skill> q)
{
    var skillsQuery = this._context.Skills.AsQueryable();
    if (q?.Filter != null)
    {
        skillsQuery = q.Filter.ApplyTo(skillsQuery, new ODataQuerySettings()) as IQueryable<Skill>;
    }

    return await skillsQuery.ToArrayAsync();
}

1 个答案:

答案 0 :(得分:1)

我想知道您的问题是否可以通过构建ModelBuilder.cs的方式解决in my SO question?在该页面中,您应该能够为每个实体定义允许的OData设置。

我在第一段中链接到的文章将比我更好地解释它,因为那是我所关注的。