OData WebAPI实践-Non-EDM模式
前文说到了 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<Account> queryOptions)
{
var querable = accounts.AsQueryable<Account>();
var finalQuery = queryOptions.ApplyTo(querable);
return Ok(finalQuery);
}
[HttpGet("{id}")]
public IActionResult Get(Guid id, ODataQueryOptions<Account> queryOptions)
{
var accountQuery = accounts.Where(c => c.AccountId == id);
if (!accountQuery.Any())
{
return NotFound();
}
var finalQuery = queryOptions.ApplyTo(accountQuery.AsQueryable<Account>()) as IQueryable<dynamic>;
var result = finalQuery.FirstOrDefault();
if (result == null)
{
return NotFound();
}
return Ok(result);
}
}
这里代码使用了
ODataQueryOptions,因此没有使用[EnableQuery]。
我们查看 OData 路由,Account 不在路径中了。

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

细心的同学发现:
- 我使用了
$count,但是返回的内容并没有计数结果。 - 返回对象中没有
@odata.context指示对应实体的 EDM 配置信息。 - 在定义了
OData EDM的对象中,返回数组类型是"Value":[]的形式,而没有定义EDM的对象会直接返回数组对象,这个在与前端进行交互的过程中需要特别注意。
限制
不使用 EDM 模式,在使用 OData 查询时还是有很多限制:
- 类似$count 之类的语句暂时还不支持。
- 不支持复杂对象(ComplexType)的 $select。
- 无法配置 EntityType 的 Ignore ,不支持一些 OData 的高级特性。
- 不能实现 OData Routing 映射,可能会造成 Versioning 之类的操作困难。
因此,还是建议在使用 OData 时使用并正确配置 EDM,这样可以获得最全面的 OData 特性支持。
OData WebAPI实践-Non-EDM模式的更多相关文章
- [转]OData/WebApi
本文转自:https://github.com/OData/WebApi/tree/vNext OData Web API Introduction OData Web API (i.e., ASP. ...
- Vue2.0 + Element-UI + WebAPI实践:简易个人记账系统
最近正在学习Vue2.0相关知识,正好近期饿了么桌面端组件Element-UI发布,便动手做了一款简易个人记账系统,以达到实践及巩固目的. 1.开发环境 Win10 + VS2015 + Sqlser ...
- [转载]基于TFS实践敏捷-Scrum模式运用
根据Forrester Research今年第二季度的一份研究报告,在超过1000名专业开发人员中,采用敏捷模式进行软件开发的已经有10.9%采用了Scrum模式,在所有的敏捷开发模式中名列首位,而在 ...
- webApi实践:开始WebApi 2
1.学习步骤总结 学习网址:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-you ...
- Apache Hadoop最佳实践和反模式
摘要:本文介绍了在Apache Hadoop上运行应用程序的最佳实践,实际上,我们引入了网格模式(Grid Pattern)的概念,它和设计模式类似,它代表运行在网格(Grid)上的应用程序的可复用解 ...
- Owin + WebApi + OAuth2 搭建授权模式(授权码模式 Part I)
绪 最近想要整理自己代码封装成库,也十分想把自己的设计思路贴出来让大家指正,奈何时间真的不随人意. 想要使用 OWIN 做中间件服务,该服务中包含 管线.授权 两部分.于是决定使用 webapi .O ...
- javascript设计模式实践之策略模式--输入验证
策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...
- javascript设计模式实践之代理模式--图片预加载
图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强. 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的on ...
- 学习实践:使用模式,原则实现一个C++自动化测试程序
个人编程中比较喜欢重构,重构能够提高自己的代码质量,使代码阅读起来也更清晰.但是重构有一个问题,就是如何保证重构后带代码实现的功能与重构前的一致,如果每次重构完成后,对此不闻不问,则会有极大的风险,如 ...
- 写给新手的WebAPI实践
此篇是写给新手的Demo,用于参考和借鉴,用于发散思路.老鸟可以忽略了. 自己经常有这种情况,遇到一个新东西或难题,在了解和解决之前总是说“等搞定了一定要写篇文章记录下来”,但是当掌握了之后,就感觉好 ...
随机推荐
- Unity UI布局与适配
目录 Canvas(画布) Basic Layout(基础布局) 实例 1.画布(Canvas) 画布是所有UI元素的父物体,任何UI元素都存在于画布之上.画布上所有UI元素的绘制顺序是根据其在场景中 ...
- 01-什么是ElasticSearch
1.什么是搜索? 百度:我们想要查找想要的一些信息比如在百度搜索一本书,一部电影这就是最常见的搜索 但是百度!=搜索 垂直搜索(站内搜索) 互联网的搜索:电商网站,新闻网站,招聘网站,等等 IT系统的 ...
- JS中报错处理 try catch finally的使用
JS中标准报错处理通过 try catch finally ,使用格式 try { } catch (err) { } finally { } 代码1: try { console.log('顺序 1 ...
- 在Windows上访问linux的共享文件夹
1. https://blog.csdn.net/weixin_44147924/article/details/123692155
- ls和mkdir
ls 查看当前目录的内容 1) ls -l 显示详细列表 2) Ls -lh 吧文件大小以人性化的方式展开 3) ls -a 显示所有的文件,包括隐藏文件,隐藏文件是已.开头的文件 4) ll 等于 ...
- 【转载】JMeter如何确定ramp-up时间
转载自:https://blog.csdn.net/wangyanhong123456/article/details/123046451 线程组:用于模拟. 线程属性包含了:线程数.Ramp-Up时 ...
- [极客大挑战 2019]Http 1
进入题目,可以看到是一个小型的网站 这里我也走了很多弯路,题目提示为HTTP,这里就可以在源码中找一些隐藏信息 搜搜.php可以看到有一个Secret.php 进入提示It doesn't come ...
- Python学习笔记--序列+集合+字典
序列 切片:从一个序列中,取出一个子序列 注意: 案例: 实现: 集合 无序性.唯一性 添加新元素: .add 移除元素: .remove 随机取出某个元素: 清空集合: .clear 取两个集合的差 ...
- 记一次生产频繁发生FullGC问题
问题发现 早上过来,饭都没来的及吃,运维就给我发来信息,说是某个接口调用大量超时.因为最近这个接口调用量是翻倍了,所以我就去检查了下慢SQL,发现确实是有较多的慢SQL,所以我就缩减了查询的时间范 ...
- 新版TinyCore Linux系统安装
1.设置软件仓库源echo "https://mirrors.163.com/tinycorelinux">/opt/tcemirror 2.安装启动加载器及其依赖tce-l ...