Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Odata-如何解析过滤器_C#_.net_Odata - Fatal编程技术网

C# Odata-如何解析过滤器

C# Odata-如何解析过滤器,c#,.net,odata,C#,.net,Odata,我有一个Odata过滤器,它是字符串,看起来像: string odataFilter = "name eq 20 and surname eq 50" 我需要完成的是从中获取以下词典: dict["name"] = "20" dict["surname"] = "50" 同样重要的是:我只想处理来自odata的“and”和“eq”关键字。没有别的了 有人知道如何解决这个问题吗?可能是通过正则表达式?我会像这样使用Regex.Split: 使用系统; 使用System.Text.Regula

我有一个Odata过滤器,它是字符串,看起来像:

string odataFilter = "name eq 20 and surname eq 50"
我需要完成的是从中获取以下词典:

dict["name"] = "20"
dict["surname"] = "50"
同样重要的是:我只想处理来自odata的“and”和“eq”关键字。没有别的了


有人知道如何解决这个问题吗?可能是通过正则表达式?

我会像这样使用
Regex.Split

使用系统;
使用System.Text.RegularExpressions;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
var dic=findAllAndEqFilter(“姓名eq 20,姓氏eq 50”);
Console.WriteLine(“测试1\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“姓名eq 21或姓氏eq 51”);
Console.WriteLine(“\r\n测试2\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称等式22”);
Console.WriteLine(“\r\n测试3\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称lt 22”);
Console.WriteLine(“\r\n测试4\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
}
公共静态字典findalandeqfilter(字符串odataFilter)
{
字典ret=新字典();
字符串[]byAnd=Regex.Split(odataFilter,“(and)”);
字符串键=”;
foreach(var和byAnd中的拆分)
如果(!Regex.IsMatch(andSplit,“(and)”)//删除和
{
字符串[]byEq=Regex.Split(和Split,“(eq)”);
foreach(byEq中的var eqSplit)
如果(!Regex.IsMatch(eqSplit,“\\s”)//如果没有空间,我们可以假设得到一个eq
如果(键==“”)
键=eqSplit;
其他的
{
ret.Add(键,eqSplit);
key=“”;
}
}
返回ret;
}
}

我会像这样使用
Regex.Split

使用系统;
使用System.Text.RegularExpressions;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
var dic=findAllAndEqFilter(“姓名eq 20,姓氏eq 50”);
Console.WriteLine(“测试1\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“姓名eq 21或姓氏eq 51”);
Console.WriteLine(“\r\n测试2\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称等式22”);
Console.WriteLine(“\r\n测试3\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称lt 22”);
Console.WriteLine(“\r\n测试4\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
}
公共静态字典findalandeqfilter(字符串odataFilter)
{
字典ret=新字典();
字符串[]byAnd=Regex.Split(odataFilter,“(and)”);
字符串键=”;
foreach(var和byAnd中的拆分)
如果(!Regex.IsMatch(andSplit,“(and)”)//删除和
{
字符串[]byEq=Regex.Split(和Split,“(eq)”);
foreach(byEq中的var eqSplit)
如果(!Regex.IsMatch(eqSplit,“\\s”)//如果没有空间,我们可以假设得到一个eq
如果(键==“”)
键=eqSplit;
其他的
{
ret.Add(键,eqSplit);
key=“”;
}
}
返回ret;
}
}

几个小时后,我创建了一个非常适合我需要的正则表达式。它只接受撇号(')之间的字符串形式的文本值。此外,您可以在不使用它们的情况下传递数值

示例:命名eq‘John’和年龄eq 75

正则表达式中的结果是分组的,因此很容易从matches集合中获取它们

"(?<PropertyName>\w+?)\s+(?<Operator>eq)\s+(?<Value>(['])(\\?.)*?\1|\d+(\.\d+)?(\s*|$))(?:\s*$|\s+(?:and)(\s+|$))"
“(?\w+)\s+(?eq)\s+(?(['))(\\?)*?\1\\\d+(\.\d+)(\s*)(?:\s*$)\s+(?:和)(\s+)”

几个小时后,我创建了一个非常适合我需要的正则表达式。它只接受撇号(')之间的字符串形式的文本值。此外,您可以在不使用它们的情况下传递数值

示例:命名eq‘John’和年龄eq 75

正则表达式中的结果是分组的,因此很容易从matches集合中获取它们

"(?<PropertyName>\w+?)\s+(?<Operator>eq)\s+(?<Value>(['])(\\?.)*?\1|\d+(\.\d+)?(\s*|$))(?:\s*$|\s+(?:and)(\s+|$))"
“(?\w+)\s+(?eq)\s+(?(['))(\\?)*?\1\\\d+(\.\d+)(\s*)(?:\s*$)\s+(?:和)(\s+)”

效果很好;)工作得很好;)很好的正则表达式!很好的正则表达式!