如何使用C#为OData查询中指定的每个过滤器获取一组键/值对?

时间:2014-10-15 22:37:29

标签: c# asp.net odata

我有一个接受OData查询的ASP.Net WebAPI服务。我的一个控制器方法接受ODataQueryOptions实例并将其应用于IQueryable实例。到现在为止还挺好。一切都按计划进行。

现在,我特别需要从OData查询中获取一个键/值对。例如,如果我指定了两个过滤器(someproperty eq 123 and otherproperty eq 456),我如何从原始过滤器中获取一个键/值对?我查看了一些ODataUriParser文档,但它确实很复杂,看起来有些过分。难道没有更简单的方法来获取简单的键/值对,就像我从普通的QueryString那样?

编辑:我已经进行了一些手工字符串解析以完成我需要的工作,但这显然不太理想。因此,我在这个问题上提供了赏金。希望有人有一个简单的解决方案!

1 个答案:

答案 0 :(得分:1)

使用正则表达式有一种简单的方法,您可以将Odata查询过滤器转换为键值对,从此回答中找到正则表达式Here

string strRegex = @"(?<Filter>" + 
"\n" + @"     (?<Resource>.+?)\s+" + 
"\n" + @"     (?<Operator>eq|ne|gt|ge|lt|le|add|sub|mul|div|mod)\s+" + 
"\n" + @"     '?(?<Value>.+?)'?" + 
"\n" + @")" + 
"\n" + @"(?:" + 
"\n" + @"    \s*$" + 
"\n" + @"   |\s+(?:or|and|not)\s+" + 
"\n" + @")" + 
"\n";

您的替换字符串就像是,

string strReplace = @"${Resource}:${Value}," 

为您提供输出,

someproperty:123,otherproperty:456

然后将该字符串转换为KeyValue参数的字典,或者您想要使用它

public Dictionary<String, String> getKeyValue(String input)
    {

           return input.Split(',').ToDictionary(kv => kv.Split(':').First(), kv => kv.Split(':').Last());

    }