ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何创建动态“包含或LIKE”表达式,以便与Linq一起使用OData服务

2019-07-10 01:06:34  阅读:349  来源: 互联网

标签:c linq expression-trees odata


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

到目前为止,只要我限制条件来构建Equal(..),GreaterThan(..)等选项,所有这些都有效.
似乎没有build / Like条件的构建,所以我尝试构建自己的.那里已经有一些文章了.我试过的一个是How to create a System.Linq.Expressions.Expression for Like?.

现在如果我使用上面的解决方案,结果where表达式

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

这很好,但错了,因为它没有转化为有效的Odata查询.

如果我使用条件’Equal’,结果是

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

这导致OData查询

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

并按预期工作.

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

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

关于如何解决这个问题的解决方案?

问候

安德烈亚斯

PS,我在静态类中实现了解决方案扩展,我改变的是从’Like’到’MyLike’的被调用方法的名称
此外,由于用于构建表达式的代码适用于任何内置条件,我认为,现在该部分是可以的.如果需要,我可以发布部分内容

解决方法:

OData目前根本不支持“like”运算符.所以无论你在客户端做什么,产生的URL都无法表达.
支持substringof,当您在filter(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());

基本上任何IQueryable都有一个属性Expression,它包含要运行的查询的表达式树.一些LINQ提供程序可能会稍微改变表达式树与编译器创建的原始表达式,但大多数应该使它接近原始表达式.

标签:c,linq,expression-trees,odata
来源: https://codeday.me/bug/20190710/1418844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有