码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OData WebAPI实践-Non-EDM模式


    合集 - OData(13)
    1.武装你的WEBAPI-OData入门2020-05-122.武装你的WEBAPI-OData便捷查询2020-05-133.武装你的WEBAPI-OData分页查询2020-05-184.武装你的WEBAPI-OData资源更新Delta2020-07-075.武装你的WEBAPI-OData使用Endpoint05-096.武装你的WEBAPI-OData之API版本管理05-057.武装你的WEBAPI-OData常见问题2021-02-028.武装你的WEBAPI-OData聚合查询03-279.武装你的WEBAPI-OData与DTO05-0810.OData WebAPI实践-OData与EDM05-11
    11.OData WebAPI实践-Non-EDM模式05-12
    12.OData WebAPI实践-兼容OData集合响应05-1513.OData WebAPI实践-与ABP vNext集成05-16
    收起

    本文属于OData系列文章

    前文说到了 EDM 与 OData 之间的关系,具有 EDM 的 OData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM,我们也可以使用 Non-EDM 方案。

    Non-EDM

    所谓 Non-EDM ,并不是说在 OData 运行时不需要 EDM 配置了,而是由 OData 动态生成的 EDM,进而实现 OData 功能。

    配置

    配置 OData 就可以不需要在内配置 GetEdmModel()。当然,如果你需要配置路由,因为函数参数需要,我们可以返回一个默认的空 EDM。

                services.AddControllers()
                    .AddOData(opt => opt.Count().Filter().Expand().Select().OrderBy().SetMaxTop(5)
                    );
    

    控制器

    为了实现 OData 的功能,我们依然需要给控制器与函数上增加一些配置:

    	[ApiController]
        [Route("api/[controller]")]
        public class AccountsController : ControllerBase
        {
            [HttpGet]
            public IActionResult Get(ODataQueryOptions queryOptions)
            {
                var querable = accounts.AsQueryable();
                var finalQuery = queryOptions.ApplyTo(querable);
                return Ok(finalQuery);
            }
    
            [HttpGet("{id}")]
            public IActionResult Get(Guid id, ODataQueryOptions queryOptions)
            {
                var accountQuery = accounts.Where(c => c.AccountId == id);
                if (!accountQuery.Any())
                {
                    return NotFound();
                }
    
                var finalQuery = queryOptions.ApplyTo(accountQuery.AsQueryable()) as IQueryable;
                var result = finalQuery.FirstOrDefault();
    
                if (result == null)
                {
                    return NotFound();
                }
    
                return Ok(result);
            }
        }
    

    这里代码使用了 ODataQueryOptions,因此没有使用 [EnableQuery]。

    我们查看 OData 路由,Account 不在路径中了。
    image

    但是我们还是可以使用 OData 语法来进行查询:

    image

    细心的同学发现:

    • 我使用了 $count,但是返回的内容并没有计数结果。
    • 返回对象中没有 @odata.context 指示对应实体的 EDM 配置信息。
    • 在定义了 OData EDM 的对象中,返回数组类型是 "Value":[] 的形式,而没有定义 EDM 的对象会直接返回数组对象,这个在与前端进行交互的过程中需要特别注意。

    限制

    不使用 EDM 模式,在使用 OData 查询时还是有很多限制:

    • 类似$count 之类的语句暂时还不支持。
    • 不支持复杂对象(ComplexType)的 $select。
    • 无法配置 EntityType 的 Ignore ,不支持一些 OData 的高级特性。
    • 不能实现 OData Routing 映射,可能会造成 Versioning 之类的操作困难。

    因此,还是建议在使用 OData 时使用并正确配置 EDM,这样可以获得最全面的 OData 特性支持。

  • 相关阅读:
    数学建模——确定性时间序列分析方法
    python-自动化篇-办公-将PDF文件转存为图片
    小议智能的测试与评价
    Vue中调用组件使用kebab-case(短横线)命名法和使用大驼峰的区别
    [精选] 多账号统一登录,你如何设计?
    (176)Verilog HDL:设计一个计数器之Count1to10
    【微机原理笔记】第 7 章 - 常用数字接口电路
    [网络工程师]-应用层协议-DNS
    网页制作课作业基于HTML+CSS+JavaScript+jquery仿慕课网教学培训网站设计实例 企业网站制作
    webpack学习使用
  • 原文地址:https://www.cnblogs.com/podolski/p/17395382.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号