如何通过简短代码实现 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。
OData的Get就是一个IQueryable接口,如果你使用EF的话,
确实就只是一句话, return db.Set<Product>();
如果不是,那事情就多了。
当然你不用EF,用NHibenate或者其他支持IQueryAble接口的也是这么用的。
一句话,有IQueryable无难事,无IQueryable千难万难。
如果是List,你直接AsQueryable就行了,无非就是服务器没有性能优化而已。功能反正是实现了。
比如一个mvc 普通的controller的函数 很明显不能 成为OData方式调用,那么是不是你这句话就能OData调用了 ——
上文中的eg._db.CustomerHasLines.Filter(kv); —— 就是干了这个事。实际上这句话的作用意味着,大约在任何传输协议中都可以OData标准,而不用自己去写一套解析。我问题的主要意义可能在于此。
@花飘水流兮: 如果是这样的话,建议你可以看看微软Odata的实现,应该是使用Filter Action 这方面的技术实现的。
你的方法是用传统的函数实现。实际上效果应该没有差别。
OData 是开源的,你可以上 https://github.com/OData/odata.net 看实现的源码。
这么说吧,如果CustomerHasLines已经实现了IQueryable接口,
那么你要的Filter(kv)函数并不会太复杂,我相信你能够自己实现的。
主要就是对Expression 相关的知识要掌握好。
@爱编程的大叔: 文中表示已经看过了,基于配置的又是工厂方式的往往非常不好找,这个都玩过的,应该很清楚。
这是醉了的节奏——Expression,我也相信我能实现,毕竟cad,板子,手机,pc...到服务器我都做得出来。
还有好多函数需要实现,这难度...~~都看到有现成的,肯定希望用现成的来集成啊。
感谢你的回答,你空了没事,帮忙找找这个答案。我周末没事,找了大半天,现在也没什么事尚在看OData DLL的路上。
@花飘水流兮: 我在使用OData最终实现解决方案之前。
自己实现了一个Filter 模型,也是类似表达式树的构造。基本能用了以后,
有一天发现可以用OData,而且性能满足我的需求,就直接转用OData了。
你要现成能用的,就得知道很详细的需求,这个工作量就不小了,没可能让人帮你做的。
集成解决方案的成本主要就在寻找技术,集成技术的时间上。
@爱编程的大叔:
微软提供的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的答案记得告知我一下,谢谢。
@爱编程的大叔: 哥老官 你的web api 支持 $count 否?
@花飘水流兮: 当然。要不然怎么用。我还是用的Net core 上的Alpha版本。
@爱编程的大叔: asp.net环境用过这个参数没。
@花飘水流兮: 应该是有的,网上大部分都是net的代码,net core代码极少。
我的客户端自动产生$count参数的。没这参数就废了。
我想也是,估计可能哪个小细节出的问题。
不过又是个断头问题——搜索引擎又没匹配项。
只有翻源码看看能不能找到原因了。
@爱编程的大叔:
不好意思再打扰一下,你(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
@花飘水流兮: 我看看我的Postman还有没有存历史记录。木有记录。这个参数没在Postman试验过。
刚刚试了一下,没有错误,就是 {ODataURL}/People/$count 。
@爱编程的大叔: 谢了。
@爱编程的大叔: 有问题一道,哥老官应该是精熟Expression的,有空看看https://q.cnblogs.com/q/103632/