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”。此外,由于用于构建表达式的代码可与任何内置条件一起使用,我认为,现在这部分还可以。如果需要,我可以将其中的一部分张贴
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 提供程序可能会对编译器创建的原始表达式树进行一些更改,但大多数提供程序应使其接近原始表达式树。