.Net Core OData 为单个实体集启用过滤 [英] .Net Core OData enable filtering for single entity set

查看:28
本文介绍了.Net Core OData 为单个实体集启用过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在 .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();});公共静态 IEdmModel GetModel(){var builder = new ODataConventionModelBuilder();var SkillSet = builder.EntitySet(nameof(Skill));SkillSet.EntityType.Count().Filter().OrderBy().Expand().Select();builder.Namespace = "ODataTest.Models";builder.ContainerName = "DefaultContainer";返回 builder.GetEdmModel();}

当我全局启用 odata 时,一切正常.但是,我不能公开我所有的实体

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

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

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

<块引用>

URI 中指定的查询无效.不能在 $filter 查询选项中使用属性名称".

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

[HttpGet][启用查询]公共异步任务<技能[]>GetFilteredODataList(ODataQueryOptions q){var SkillsQuery = this._context.Skills.AsQueryable();if (q?.Filter != null){SkillsQuery = q.Filter.ApplyTo(skillsQuery, new ODataQuerySettings()) as IQueryable;}返回等待技能查询.ToArrayAsync();}

解决方案

不知你的问题能否通过 ModelBuilder.cs 的构建方式解决 在我的 SO 问题中? 在该页面中,您应该能够定义每个实体允许哪些 OData 设置.

我在第一段中链接到的文章会比我更好地解释它,因为那是我关注的内容.

I'm running the Beta of OData on .Net Core. I'm trying to only enable certain features of odata depending on the controller. My startup class looks like so:

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();
}

When I globally enable odata everything works fine. However, I cannot expose all of my entities

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

but when, I try to enable odata for a specific entity set my I get an error when I attempt to filter

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

The query specified in the URI is not valid. The property 'Name' cannot be used in the $filter query option.

For the sake of completeness here is my controller:

[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();
}

解决方案

I wonder if your issue could be solved by the way ModelBuilder.cs is built in my SO question? In that page you should be able to define per entity what OData settings are permitted.

The article I link to in the first paragraph will explain it better than I did as that was what I was following.

这篇关于.Net Core OData 为单个实体集启用过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆