我有现有的内部 OData 服务。
目标是为外部用户创建新服务。
我尝试使用 odata 客户端创建 IQueryable,然后使用添加了过滤器的 WebApi 将其公开。
//autogenerated by T4 from odata client
public partial class Container : Microsoft.OData.Client.DataServiceContext
{
...
public DataServiceQuery<Model> Models {...}
}
//minified version of generated model
public class Model
{
public int Type { get; set; }
public string Test { get; set; }
}
//api controller
private Container client;
[EnableQuery]
public IQueryable<Model> Get()
{
return client.Models.Where(i=>i.Type==123);
}
就这么简单。然而它不工作。看起来来自 ms odata 客户端的 QueryProvider 不支持由 ms webapi odata 构建的表达式。
此代码正在运行
client.Models.Where(i=>i.Type==123).Where(i=>i.Test.Contains("qwe")).ToList()
这个请求不
http://localhost:44301/Model?$filter=contains(Test,'qwe')
例外
The expression (IIF((($it.Test== null) OrElse False), null, Convert($it.Test.Contains(\"qwe\"))) == True) is not supported.
我喜欢这个想法本身,因为我不需要缓存数据而只提供查询。
有什么办法可以使这项工作?
现在我看到的唯一选择是编写自定义 QueryProvider。