学odata的时候,用expand。发现网上的例子要么太古老,要么expand用不了。安装Microsoft.AspNetCore.Odata的最新版本库,又不知道怎么用。微软官网搜索都是asp.net framework的案例。
实在没辙了,看看源码吧。怎么用有说明,很简单。
自己写了一个Demo,总是报ArgumentException: Object of type 'System.Linq.EnumerableQuery`1[Microsoft.AspNetCore.OData.Query.Wrapper.SelectAllAndExpand`1[***]]' cannot be converted to type 'System.Linq.IQueryable`1[***]'.
尝试了很多办法,都没解决。
下载了源码,有sample,我用其中ODataRoutingSample项目跑起来可以用expand。看代码跟自己的Demo没看出区别。有参考就好说了,一点一点对比呗。自己创建的是 asp.net core api项目,目标框架net core 3.1 。
最后发现是control和action不能同时加 [EnableQuery] 特性。
报错中的SelectAllAndExpand是啥呢,通过看源码他继承自SelectExpandWrapper。
意思大概就是因为odata表达式不同,action返回的model不同。就比如现在加了expand,返回结果和不用expand的不同。用SelectExpandWrapper包装一下。
自己猜测control和action都加[EnableQuery]特性,导致包装了两层。原本System.Linq.EnumerableQuery[***]就行,现在变成了System.Linq.EnumerableQuery[Microsoft.AspNetCore.OData.Query.Wrapper.SelectAllAndExpand[***]]。
有大佬知道具体的原因,希望不吝赐教。
另外提一嘴,你的control都不必须继承自Microsoft.AspNetCore.OData.Routing.Controllers.ODataController。继承自Microsoft.AspNetCore.Mvc.ControllerBase也可以用odata。