如何创建动态“包含或类似”表达式以与Linq针对OData服务一起使用

And*_*eas 5 c# linq expression-trees odata

我尝试使用System.Linq.Expressions.Expression(WPF / c#4.0)创建一个动态查询工具,该工具针对OData服务运行。

到目前为止,只要我限制建立条件的条件(如Equal(..),GreaterThan(..)等),一切就可以正常工作。contains/ Like条件似乎没有任何构建,因此我尝试构建自己的条件。已经有一些文章了。我尝试过的一个方法是如何为Like创建System.Linq.Expressions.Expression?

现在,如果我使用上述解决方案,则结果为

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'
Run Code Online (Sandbox Code Playgroud)

很好,但是错误,因为它不会转换为有效的Odata查询。

如果我使用条件“等于”,则结果为

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => (clt.LastName == "te"))}
Run Code Online (Sandbox Code Playgroud)

这导致OData查询

results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B} 
Run Code Online (Sandbox Code Playgroud)

并按预期工作。

我在解决方案的实现方面做错了,还是不能与OData一起使用?

它应该转移到类似 ...?$filter=substringof('te', LastName ) eq true

关于如何解决此问题的任何解决方案?

问候

安德烈亚斯

PS,我在静态类中实现了解决方案扩展,我所更改的只是被调用方法的名称,从“ Like”更改为“ MyLike”。此外,由于用于构建表达式的代码可与任何内置条件一起使用,我认为,现在这部分还可以。如果需要,我可以将其中的一部分张贴

Vit*_*SFT 1

OData 目前根本不支持“like”运算符。所以无论你在客户端做什么,生成的 URL 都无法表达这一点。支持 substringof,并且当您在过滤器 (Where) 表达式中使用 string.Contains 方法时,客户端 LINQ 提供程序应生成它。

要获取 C# 编译器生成的表达式,您可以执行以下操作:

IQueryable<string> source = new List<string>().AsQueryable();
IQueryable<string> result = from item in source where item.Contains("John") select item;
Console.WriteLine(result.Expression.ToString());
Run Code Online (Sandbox Code Playgroud)

基本上任何 IQueryable 都有一个属性 Expression,其中包含要运行的查询的表达式树。某些 LINQ 提供程序可能会对编译器创建的原始表达式树进行一些更改,但大多数提供程序应使其接近原始表达式树。

  • `pe = Expression.Parameter(typeof(myClient), "clt"); PropertyInfo propertyInfo = typeof(myClient).GetProperty("PropertyFieldName"); MemberExpression m = Expression.MakeMemberAccess(pe, propertyInfo); ConstantExpression c = Expression.Constant("SearchFrase", typeof(string)); MethodInfo mi = typeof(string).GetMethod("包含", new Type[] { typeof(string) }); e1 = exp.Expression.Call(m, mi, c);` (2认同)