OData – How It Work
前言
OData 是很冷门的东西, 用的人少, 开发的人少, 文档自然也少的可怜.
如果真的想用它, 多少要对它机制有点了解. 这样遇到 bug, 想扩展的时候才不至于完全没有路.
主要参考:
OData NxT 001: Project Proposal
OData NxT 002: OData Queries Deep Dive
OData Nxt 003: Converting Query String to AST
OData Nxt 004: Query to Expression (IQueryable)
OData Nxt 005: Expression to Query (Part 1)
OData 解决什么问题?
对我来说, OData 最重要的就是它的 Query. 甚至可以把它当成 client side 的 SQL query.
尤其在前后端分离后, 有了 OData 后端可以省下很多不必要的接口. 前端有了获取任意数据的能力, 而不需要总是依赖后端.
OData 怎样解决这些问题?
如果撇开具体实现, OData 其实只是定义了一个规范, Client 如何向后端表达想要的数据.
比如 products?$filter=category eq 'Phone' and price gt 100&$orderby=price
意思是想获取手机类价格大于 100 元的产品, 然后依据价格小到大排序.
从前我们也能表达这些, 只是没有规范而已. 比如: products?category=Phone&price=100&orderby=price
除了定义规范以外, 最重要的当然是实现.
最终的目的就是拿数据嘛. 所以 OData query -> SQL query 是必然的.
这个和 EF Core 做的事, 非常的像. 所以 OData 的实现手法也会很类型 EF Core.
在 ASP.NET Core, SQL query 一般上都是由 EF Core 来处理的. 它通过翻译 LINQ Expression Tree 生成 SQL Query.
OData 当然不会从造轮子, 所以 OData query > LINQ Expression Tree > SQL Query 就是它的路线图了. 前半段 OData 搞, 后半段依然交给 EF Core 完成.
Entity Data Model (EDM)
与 EF Core 类似, OData 也是从 Setup Model 开始. ODataEdmModel 里头就包含了所有的 Entity 结构和 Metadata
对了, OData 的 Entity 并不一定要和 EF Core 的 Entity 一摸一样哦, 当然如果不一样的话, 就需要通过 AutoMapper 之类的工具来帮忙做一些 conversion 的动作啦.
不然就没有办法一条龙顺顺 OData query > LINQ Expression Tree > SQL Query 了.
Routing
依据 EDM 的结构, Routing 基本就已经定了.
比如 entity name products 的话, 其 URL 就是 /products, /products/1, products(1), products/1/category 等等
Controller 的职责
Controller 有 3 个职责,
1. 和上面的 routing 做匹配, 可以通过 controller name 和 action name, 或者用 route attribute 方式, (注: 上面的 URL 是定了的, 这里只是 match 它而已, 而不是修改它哦)
2. 返回 IQueryable (结合 EF Core 通常这样做)
3. 获取 ODataQueryOptions, 调用 ApplyTo(IQueryable), 通过 LINQ Expression Tree 想办法获取最终数据 (没有用 EF Core 的话, 通常是这样做)
EnableQueryAttribute 的职责
它是一个 ActionFilterAttribute. 拦截 before/after action.
Before action 会把 URL query string 变成了 ODataQueryOptions, 同时也做了 validation, 比如 MaxExpansionDepth 等等
After action 会 apply query > to list > serialize (如果在 Action 里已经 apply 了, 它就不会再 apply 了)
Serializer
OData 的 response 除了数据以为, 还会附上其它 info, 比如 @odata.context, @odata.nextLink, @odata.count 等等
所以它并不是简单的 JSON response. 它有自己的 Serializer.
TODO
先写这么多, 等以后有更多细节时在补上
OData 常用资源:
Hassan Habib Youtube For OData
OData – How It Work的更多相关文章
- ABP框架 - OData 集成
文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响应 查询 请求 响 ...
- ABP源码分析三十八: ABP.Web.Api.OData
如果对OData不熟悉的话可参考OData的初步认识一文以获取OData的一些初步知识. API.Odata 模块唯一用处就是提供了一个泛型版本的ODataController,实现了Controll ...
- OData Client Code Generator
转发. [Tutorial & Sample] How to use OData Client Code Generator to generate client-side proxy cla ...
- Microsoft Dynamics CRM 2013 Js Odata 查询
实现功能: 在新建记录时,(大区,省区,城市)的值默认为当前用户的值.tips:字段均为lookup类型; function Default_region(){ var fromtype=Xrm. ...
- 让OData和NHibernate结合进行动态查询
OData是一个非常灵活的RESTful API,如果要做出强大的查询API,那么OData就强烈推荐了.http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Ent ...
- Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
前言 很久没更新了,之前有很多事情,所以拖了很久,非常抱歉.好了,废话不多说,下面开始正题.本篇仍然使用上一季的的项目背景(系列地址http://www.cnblogs.com/fzrain/p/34 ...
- ABP理论学习之OData集成(新增)
返回总目录 本篇目录 介绍 安装 创建控制器 例子 样例项目 介绍 OData在其官网的定义是: 允许以一种 简单且标准的方式创建和使用可查询的.可互操作的RESTful APIs. 在ABP中也可以 ...
- OData的初步认识
What – OData是什么? OData - Open Data Protocal,是一个设计和使用RESTful API的标准.REST本身只是一个构建web服务的思想和理念,其没有规定一个统一 ...
- OData V4 学习目录
开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准. Open Data Protocol (开放数据协议,OData)是用 ...
- OData V4 系列 Action 与 Function
OData 学习目录 了解过WebApi的都知道,WebApi默认方法 Get.Post.Put,如果增加其它过多Post方法即不能识别,还需增加其它配制,请求的Url还需加上Controller及A ...
随机推荐
- [oeasy]python018_ 如何下载github仓库_git_clone_下载仓库
继续运行 回忆上次内容 上次从 2行代码 进化到了 万行代码 命令 作用 yy 复制光标所在行代码 到剪贴板 p 粘贴 剪贴板中的内容 9999p 将剪贴板中的代码粘贴9999次 保存运行一条龙 :w ...
- [oeasy]python0106 七段数码管_显示字母_BP机
七位数码管进化 回忆上次内容 上次回顾了 7-seg 七位数码管 可以显示数字 甚至是十六进制数字 添加图片注释,不超过 140 字(可选) 能否让 七位数码管 将26个字母 全部都显 ...
- oeasy教您玩转vim - 19 - 使用标记
使用标记 回忆上节课内容 跳转到行号 200G 设置行号选项 显示行号 :se nu 显示相对行号 :se rnu 如何用命令行跳转 :100 但是我如何有的时候记不住到底跳到多少行 能否做个标记留个 ...
- OLOR:已开源,向预训练权值对齐的强正则化方法 | AAAI 2024
随着预训练视觉模型的兴起,目前流行的视觉微调方法是完全微调.由于微调只专注于拟合下游训练集,因此存在知识遗忘的问题.论文提出了基于权值回滚的微调方法OLOR(One step Learning, On ...
- locust多进程实现分布式压测遇到的问题
多进程分布式的实现: locust分布式时,需借助命令locust 一个一个启动worker,在使用中有点繁琐, 下面借助于多进程,按既定worker数量,一键启动: from locust impo ...
- 涨见识了!脱离vue项目竟然也可以使用响应式API
前言 vue3的响应式API大家应该都特别熟悉,比如ref.watch.watchEffect等.平时大家都是在vue-cli或者vite创建的vue项目里面使用的这些响应式API,今天欧阳给大家带来 ...
- 【H5】09 音频和视频
现在我们可以轻松的为一张 web 网页添加简单的图像,下一步是开始为 HTML 文档添加音频和视频的播放器. 在这篇文章当中,我们会学习到 <video> 和 <audio> ...
- 【OracleDB】 10g 安装(Windows)
Win7系统环境建议右键[管理员身份运行] - 指明选择的安装目录在哪[只更换盘符即可,对官方默认的目录不更改] - 安装类型选择企业版 - 安装Oracle的同时创建数据库服务[数据库] - 口令即 ...
- 【Vue】Re14 Router 第一部分(入门案例)
一.箭头函数(Lambda匿名函数) <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 自然语言处理:通过API调用各大公司的机器翻译开放平台
国内大公司做机器翻译做的比较好的有讯飞和百度,这里给出这两个公司机器翻译的开放平台API的介绍: 讯飞开放平台: 链接:https://www.xfyun.cn/doc/nlp/xftrans_new ...