ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OData – How It Work

2021-12-04 01:03:34  阅读:207  来源: 互联网

标签:Core EF OData Work How products Query query


前言

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 常用资源:

Microsoft Docs

OData Blog

Hassan Habib Youtube For OData

 

标签:Core,EF,OData,Work,How,products,Query,query
来源: https://www.cnblogs.com/keatkeat/p/15640688.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有