首页 新闻 会员 周边 捐助

OData 实现

0
[已关闭问题] 关闭于 2018-01-30 09:00

如何通过简短代码实现 IEnumerable<T> Or IQuerable<T> 的   完整   OData (Get) 接口;

例如:_db.CustomerHasLines.Filter(kv); —— 但只能实现 (Get)部分功能,比如函数部分尚不能实现。

 

查看了一下ODataController源码,刚好没有Get的实现,webapi正常情况是通过手动敲代码写builder,那么猜测通过builder来创建了一系列过程,但凡变成微软的工厂套路,都不太好找代码。

不知道这一段过程如何的调用OData的类达成   集合 => OData  。

 

(Get):只需要解决Get完整模式就行了,核心也主要是这个。

问题补充:

用在其他地方,并不一定用在weiapi框架下,可能并不来自继承ODataController,甚至只是一个其他方式实现的http甚至不是http服务,比如上面示例直接用在mvc和tcp代码中;

不通过配置,而通过代码控制;

就像wcf,如果只是配置 —— 比如你要内置一个  服务(类) 作为Wcf服务成员,并且配套几个相互依赖的服务(类),配置只能望洋兴叹,那肯定不行的,必须用代码构建ServiceHost,并且需要抛弃  配置式  的内部工厂创建方式,自行使用代码  来创建 CustomerServiceHost。

花飘水流兮的主页 花飘水流兮 | 专家六级 | 园豆:13617
提问于:2018-01-28 21:25
< >
分享
所有回答(1)
0

OData的Get就是一个IQueryable接口,如果你使用EF的话,

确实就只是一句话, return db.Set<Product>();

如果不是,那事情就多了。

当然你不用EF,用NHibenate或者其他支持IQueryAble接口的也是这么用的。

一句话,有IQueryable无难事,无IQueryable千难万难。

 

如果是List,你直接AsQueryable就行了,无非就是服务器没有性能优化而已。功能反正是实现了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2018-01-29 09:31

 比如一个mvc 普通的controller的函数 很明显不能 成为OData方式调用,那么是不是你这句话就能OData调用了 —— 

 上文中的eg._db.CustomerHasLines.Filter(kv); —— 就是干了这个事。实际上这句话的作用意味着,大约在任何传输协议中都可以OData标准,而不用自己去写一套解析。我问题的主要意义可能在于此。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-01-29 09:58

@花飘水流兮: 如果是这样的话,建议你可以看看微软Odata的实现,应该是使用Filter Action 这方面的技术实现的。

你的方法是用传统的函数实现。实际上效果应该没有差别。

OData 是开源的,你可以上 https://github.com/OData/odata.net 看实现的源码。

 

这么说吧,如果CustomerHasLines已经实现了IQueryable接口,

那么你要的Filter(kv)函数并不会太复杂,我相信你能够自己实现的。

主要就是对Expression 相关的知识要掌握好。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-01-29 10:36

@爱编程的大叔: 文中表示已经看过了,基于配置的又是工厂方式的往往非常不好找,这个都玩过的,应该很清楚。

这是醉了的节奏——Expression,我也相信我能实现,毕竟cad,板子,手机,pc...到服务器我都做得出来。

还有好多函数需要实现,这难度...~~都看到有现成的,肯定希望用现成的来集成啊。

感谢你的回答,你空了没事,帮忙找找这个答案。我周末没事,找了大半天,现在也没什么事尚在看OData DLL的路上。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-01-29 11:03

@花飘水流兮: 我在使用OData最终实现解决方案之前。

自己实现了一个Filter 模型,也是类似表达式树的构造。基本能用了以后,

有一天发现可以用OData,而且性能满足我的需求,就直接转用OData了。

你要现成能用的,就得知道很详细的需求,这个工作量就不小了,没可能让人帮你做的。

集成解决方案的成本主要就在寻找技术,集成技术的时间上。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-01-29 12:05

@爱编程的大叔:

微软提供的OData程序集应该是现成能用的,这应该没你说的那么重,也就是类似将工厂模式换成code模式的实现代码而已。

 

但难得网上实在没什么答案,诸如其他的工厂模式,如wcf等等,通常微软都会放出非工厂创建的code模式。

重新审视了一下OData assembly,貌似有了点眉目 ——

估计OData assembly基本思路:(EdmModel,EdmElement,uri)  => ODataUriParser,也许最后是通过该类获取到各种Filter组合进行执行。

这也有点怪,不知道微软如何权衡的 —— 是EdmModel和EdmElement,而不是IQuerable 或者 IEnumerable。还没详细看odata v4协议,如果是前者除非协议直接支持join之类的,貌似才需要EdmModel。

—— 再试试看, good luck for me。若有了这几句code的答案记得告知我一下,谢谢。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-01-29 13:24

@爱编程的大叔: 哥老官  你的web api 支持 $count 否?

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 09:28

@花飘水流兮: 当然。要不然怎么用。我还是用的Net core 上的Alpha版本。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-02-02 09:30

@爱编程的大叔: asp.net环境用过这个参数没。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 09:32

@花飘水流兮: 应该是有的,网上大部分都是net的代码,net core代码极少。

我的客户端自动产生$count参数的。没这参数就废了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-02-02 09:38

我想也是,估计可能哪个小细节出的问题。

不过又是个断头问题——搜索引擎又没匹配项。

只有翻源码看看能不能找到原因了。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 09:48

@爱编程的大叔: 

不好意思再打扰一下,你(v4)的写法是否是

System Query Option $count

The $count system query option allows clients to request a count of the matching resources included with the resources in the response.
The request below returns the total number of people in the collection.

GET serviceRoot/People/$count 

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 09:51

@花飘水流兮: 我看看我的Postman还有没有存历史记录。木有记录。这个参数没在Postman试验过。

刚刚试了一下,没有错误,就是 {ODataURL}/People/$count 。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2018-02-02 10:25

@爱编程的大叔: 谢了。

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 11:26

@爱编程的大叔: 有问题一道,哥老官应该是精熟Expression的,有空看看https://q.cnblogs.com/q/103632/

支持(0) 反对(0) 花飘水流兮 | 园豆:13617 (专家六级) | 2018-02-02 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册