我正在为我们的 odata v4 服务实现一些功能。我们希望支持所有函数的过滤查询选项,就像实体集合一样。
假设我们有一个 SearchProducts 函数,它接受一个 ProductType 参数,并返回属于特定 ProductType 的所有产品。
现在的问题是,我没有找到任何支持这种需求的 odata 内置方法。我能弄清楚的唯一方法是手动解析 FilterClause,然后将其应用于从函数返回的结果。
检查此示例代码:
IQueryable<Product> collection = _service.SearchProducts(ProductType.Phone);
var parser = new ODataUriParser(model, new Uri("SearchProducts(ProductType='Phone')?$filter=Name eq 'IPhone'", UriKind.Relative));
var filter = parser.ParseFilter();
// TODO: apply filter on collection, to filter all iphones. get the results same as the following code
// TODO: collection = collection.Where(p=>p.Name == "IPhone");
Run Code Online (Sandbox Code Playgroud)
该系列将是所有电话产品。添加 $filter 字符串后,它应该返回所有 iPhone 产品。
我可以将 FilterClause 解析为 lambda 表达式,然后将其应用于集合以返回正确的结果。但是考虑到 $filter 的复杂性,解析器可能会非常复杂并且会花费很多时间。
有人对此有快速解决方案吗?谢谢你