Ret*_*der 5 c# linq-to-entities expression-trees
我正在研究由同事编写的一些表达式树代码,并且正在研究添加其他表达式的可能性.它目前支持:equals,not-equals,IsNull等.我需要添加一些东西,允许它使用类似于SQL"Like"命令或使用正则表达式的通配符比较.目前,代码解析XML文件并提取数据,然后使用类似于下面所示行的代码处理这些数据.这是"平等"表达的一个例子."callExp"是一个MemberExpression,它基本上保存了我的表(Entities)的字段名称,GetConstantExpression获取了我正在比较的数据的详细信息.
xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element("Value"), callExp.Type));
Run Code Online (Sandbox Code Playgroud)
我所追求的是一种创建类似于"Like"命令的"Expression"的方法.这可以使用类似于上面的几行来完成,还是会更复杂?有什么好的资源可以帮助这个领域吗?
================================================== ================================
基于反馈的新代码:
我正在看一些例子,并尝试了以下我希望能创建一个表达式.它给了我下面显示的错误.我是否朝着正确的方向创建"StartsWith"表达式?_entityExp是对MyClass的ParameterExpression引用.
ParameterExpression p = Expression.Parameter(_entityExp.Type, "entity");
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
var containsMethodExp = Expression.Call(p, method, Expression.Constant("root"), p);
Run Code Online (Sandbox Code Playgroud)
在'System.String'类型上声明的方法'Boolean StartsWith(System.String)'不能使用'MyClass'类型的实例调用
表达式树只能表示与.NET语言相同的功能 - 方法调用,属性评估等.
你通常最接近"喜欢"的是打电话string.StartsWith,string.EndsWith或string.Contains.如果您想要处理正则表达式,则可能需要使用Regex.IsMatch.无论哪种方式,这都是封装在方法中而不是表达树本身的"语言"中的东西.
如果不了解表达树的消耗方式,就很难确切地说出你应该做什么.您可以创建自己的"Like"方法,消费者会注意到并正确处理,例如...或者您可以使用现有的字符串/正则表达式方法.
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |