C# 如何在IEnumerable/IQueryable集合上应用odata FilterClause

C# 如何在IEnumerable/IQueryable集合上应用odata FilterClause,c#,filter,odata,C#,Filter,Odata,我正在为我们的ODataV4服务实现一些功能。 我们希望为所有函数支持filter query选项,就像实体集合一样 假设我们有一个SearchProducts函数,该函数接受ProductType参数,并返回属于特定ProductType的所有产品 现在的问题是,我没有找到任何odata内置方法来支持这种需求。我唯一能弄明白的方法是手动解析FilterClause,然后将其应用于函数返回的结果 检查此示例代码: IQueryable<Product> collection = _s

我正在为我们的ODataV4服务实现一些功能。 我们希望为所有函数支持filter query选项,就像实体集合一样

假设我们有一个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");
IQueryable collection=\u 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:对集合应用筛选器,以筛选所有iPhone。获得与以下代码相同的结果
//TODO:collection=collection.Where(p=>p.Name==“IPhone”);
该系列将是所有手机产品。添加$filter字符串后,它应该返回所有IPhone产品

我可以将FilterClause解析为lambda表达式,然后将其应用于集合以返回正确的结果。但是考虑到$filter的复杂性,解析器可能非常复杂,并且会花费很多时间


有人能快速解决这个问题吗?谢谢你

你能解决它吗?@PavelJedlicka我没有找到一个简单的方法,最终手动解析了过滤器