LINQ动态查询的实现浅析

开发 后端
LINQ动态查询是如何实现的呢?LINQ动态查询在使用扩展库Dynamic.cs之后有什么效果呢?那么本文就向你详细介绍相关内容。

LINQ动态查询的过程是怎么实现的呢?我们实现LINQ动态查询会用到还说呢么方法呢?扩展库Dynamic.cs的实现是什么效果呢?那么让我们来看看具体的内容。

LINQ动态查询已经由微软提供的一个LINQ动态查询扩展库Dynamic.cs实现(下载地址:http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx,该文件包含在\CSharpSamples\LinqSamples\DynamicQuery目录下),这个扩展库支持在Where方法中使用SQL查询表达式,这样我们可以在表示层或业务层构建SQL条件表达式,然后交给LINQ查询,遗憾的是,这个扩展库不支持SQL中的“Like”运算符,没有模糊查询功能的查询怎么能叫查询呢(拗口……)

事实上,动态查询库是利用Lambda表达式来实现动态查询功能的,因此只要对该扩展库再次进行扩展,让它支持LIKE操作符就是,实现起来并不困难。扩展库的原理是重载扩展方法Where,然后对传入的字符串形式的SQL条件表达式进行分析,最终生成Lambda式。明白这个原理后,修改起来也就很简单了。

找到ExpressionParser类,在TokenId枚举中增加一个枚举值:Like,在分析字符串表达式的方法中加入一个case条件,用来判断操作符是否为Like:

LINQ动态查询实现实例:

  1. case 'L':  
  2. case 'l':  
  3. NextChar();  
  4. if (ch == 'I' || ch == 'i')  
  5. {  
  6. NextChar();  
  7. if (ch == 'K' || ch == 'k')  
  8. {  
  9. NextChar();  
  10. if (ch == 'E' || ch == 'e')  
  11. {  
  12. NextChar();  
  13. t = TokenId.Like;  
  14. }  
  15. }  
  16. }  
  17. break

需要修改的还有几个方法,不再一一细述,目的都是为了对Like操作符进行检查,并转到查应的操作。***增加一个方法GenerateLike,用来产生支持模糊查询的Lambda表达式。代码如下:

  1. //创建Like表达式  
  2. Expression GenerateLike(Expression left, Expression right)  
  3. {  
  4. string value = right.ToString().Replace("\"","");  
  5. right = RemovePrecent(value);  
  6. if (value.StartsWith("%") && value.EndsWith("%"))  
  7. {  
  8. MethodInfo method = left.Type.GetMethod("Contains");  
  9. return Expression.Call(left, method, new[] { right });  
  10. }  
  11. else if(value.StartsWith("%"))  
  12. {  
  13. MethodInfo method = left.Type.GetMethod(  
  14. "EndsWith"new[] { typeof(string) });  
  15. return Expression.Call(left, method, new[] { right });  
  16. }  
  17. else if (value.EndsWith("%"))  
  18. {  
  19. MethodInfo method = left.Type.GetMethod(  
  20. "StartsWith"new[] { typeof(string) });  
  21. return Expression.Call(left, method, new[] { right });  
  22. }  
  23.  
  24. return GenerateEqual(left, right);  
  25. }  
  26.  
  27. //去掉查询字符中的%符号  
  28. Expression RemovePrecent(string value)  
  29. {  
  30. return Expression.Constant(  
  31. value.Replace("%",String.Empty),  
  32. typeof(string));  
  33. }  

LINQ动态查询的相关内容就向你介绍到这里,希望那个对你了解和学习LINQ动态查询有所帮助。

【编辑推荐】

  1. LINQ模糊查询的学习心得浅析
  2. LINQ嵌套查询实现浅析
  3. LINQ查询方式的探寻
  4. LINQ查询的效果分析
  5. LINQ查询和泛型类型的关系浅析
责任编辑:仲衡 来源: 网易博客
相关推荐

2009-09-15 09:19:22

linq动态条件

2009-09-14 18:23:59

LINQ嵌套查询

2009-09-14 19:20:22

LINQ TO SQL

2009-07-22 13:04:41

iBATIS动态查询

2009-09-15 10:35:11

linq多表查询

2009-09-17 18:05:15

linq to sql

2009-09-10 14:47:53

Linq .NET查询

2009-09-14 16:29:39

LINQ嵌套

2009-09-17 17:03:13

LINQ动态查询

2009-09-14 09:46:00

LINQ to SQL

2009-09-14 17:10:57

LINQ模糊查询

2009-09-15 17:16:58

LINQ查询操作符

2009-09-15 10:16:01

LINQ动态查询

2009-09-17 16:46:34

Linq to sql

2009-09-18 15:15:12

LINQ to SQL

2009-09-14 18:19:49

LINQ模糊查询

2009-09-17 08:47:00

Linq插入数据

2009-09-13 21:52:16

LINQ字符串

2009-09-16 17:29:10

Linq查询二维数组

2009-09-08 16:36:10

LINQ查询基于泛型类
点赞
收藏

51CTO技术栈公众号