LINQ模糊查询学习体验浅析

开发 后端
LINQ模糊查询的实际应用是什么呢?那么这里向你介绍一个具体的使用实例,我们将会看到LINQ模糊查询的具体实现步骤以及思路,想对你学习LINQ模糊查询有所帮助。

LINQ模糊查询来实现复合搜索的功能,具体的操作过程是什么呢?在这里向你介绍一下处理过程,使用LINQ模糊查询有什么需要注意的呢?那么我们通过这个例子希望对你有所启发。

LINQ模糊查询实现的多条件复合搜索效果如下图:

LINQ模糊查询实现的多条件复合搜索效果 

LINQ模糊查询实现阶段一:

首先是找到了李永京(YJingLee)前辈的《LINQ体验(17)——LINQ to SQL语句之动态查询》一文,利用Lambda表达式树可以进行动态查询。写了个方法进行复合查询,动态组合条件,生成Lambda表达式。

  1. /// <summary>  
  2. /// 这个方法带分页功能,通过输入的键值对NVC进行复合查询  
  3. /// </summary>  
  4. List<UserT_TractInfo> GetPagedObjectsByNVC(  
  5. int startIndex, int pageSize,   
  6. NameValueCollection nvc, bool isAnd)  
  7. {  
  8. IQueryable<UserT_TractInfo> query =   
  9. Consulting.Instance.UserT_TractInfo;  
  10. query.Where(t => t.IsDel == 0).  
  11. Where(t => t.IsAuditing == 1);//审核和逻辑删除  
  12.  
  13. Expression condition = null;  
  14. ParameterExpression param = Expression.  
  15. Parameter(typeof(UserT_TractInfo), "c");  
  16. int propertyCount = 0;  
  17. foreach (string key in nvc)  
  18. {  
  19. Expression right = Expression.Constant(nvc[key]);//键  
  20. string keyProperty = key;//属性  
  21. if (typeof(UserT_TractInfo).GetProperty(keyProperty) != null)  
  22. //当对象存在此属性时(因为键值对可能还有很多其他的参数,例如page)  
  23. {  
  24.   Expression left = Expression.Property(param,  
  25. typeof(UserT_TractInfo).GetProperty(keyProperty));//建立属性  
  26.   Expression filter = Expression.Equal(left, right);//过滤器  
  27.   if (condition == null)  
  28.   {  
  29. condition = filter;  
  30.   }  
  31.   else 
  32.   {  
  33.  if (isAnd)  
  34.  {  
  35. condition = Expression.And(condition, filter);  
  36.  }  
  37.  else 
  38.  {  
  39. condition = Expression.Or(condition, filter);  
  40.  }  
  41.   }  
  42.   propertyCount++;  
  43. }  
  44. }  
  45. //以上foreach组合了各个有效的键值对对应的conditionExpression,  
  46. //复合查询最重要的组合工作就这么完了  
  47. if (propertyCount > 0)  
  48. {  
  49. Expression pred = Expression.Lambda(condition, param);  
  50. MethodCallExpression whereCallExpression =   
  51. Expression.Call(typeof(Queryable), "Where",   
  52. new Type[] { typeof(UserT_TractInfo) },  
  53.  Expression.Constant(query), pred);  
  54.  
  55. return Consulting.Instance.UserT_TractInfo.AsQueryable().  
  56. Provider.CreateQuery<UserT_TractInfo>(whereCallExpression).  
  57. OrderByDescending(t => t.ID).Skip(startIndex - 1).  
  58. Take(pageSize).ToList();//查询出结果  
  59. }  
  60. else 
  61. {  
  62. return Consulting.Instance.UserT_TractInfo.  
  63. OrderByDescending(t => t.ID).Skip(startIndex - 1).  
  64. Take(pageSize).ToList();  
  65. //如果没有有效键值对,则返回全部结果  
  66. }  
  67. }  

搞了半天本来很兴奋的,之后才知道Lambda表达式是写不出.Contains()的,我的心瓦凉瓦凉的。

LINQ模糊查询实现阶段二:

虽然李永京的文章没给我多少帮助,但它后面有个回复很有价值:“用微软提供的System.Linq.Dynamic方便点。”很快找到了对应例子和Dynamic.cs,也找到了《Linq to SQL Dynamic 动态查询》,有更细致的例子,可惜Dynamic.cs也是不能使用like的,恨啊!

  1. return Consulting.Instance.UserT_TractInfo.Where(  
  2. "b_number == @0","P(2007)031").OrderByDescending(t => t.ID).  
  3. Skip(startIndex - 1).Take(pageSize).ToList(); 

代码很容易,但没什么用:(

LINQ模糊查询实现阶段三:

中文的实在是找不到了,在MS的官方BBS上找到了个链接,非常有用!《dynamic linq queries / dynamic where clause (part 2) 》,这个老外扩展了Dynamic.cs,写了个PredicateExtensions类,虽然不知道他是怎么想出来的,但确实有效!

这里放出核心代码,很容易看懂,简单就是美!

  1. searchPredicate = PredicateExtensions.  
  2. True<UserT_TractInfo>();  
  3. foreach (string key in nvcParam)  
  4. {  
  5. string condition = string.Empty;  
  6. switch (key)  
  7. {  
  8.   case "b_number":  
  9.  condition = nvcParam[key];  
  10.  searchPredicate = searchPredicate.And(u =>  
  11.  u.B_number.Contains(condition));  
  12.  break;  
  13.   case "b_address":  
  14.  condition = nvcParam[key];  
  15.  searchPredicate = searchPredicate.And(u =>   
  16. u.B_address.Contains(condition));  
  17.  break;  
  18.   case "b_canton":  
  19.  condition = nvcParam[key];  
  20.  searchPredicate = searchPredicate.And(u =>   
  21. u.B_canton.Contains(condition));  
  22.  break;  
  23.   case "a_status":  
  24.  condition = nvcParam[key];  
  25.  searchPredicate = searchPredicate.And(u =>   
  26. u.A_status.ToString().Contains(condition));  
  27.  break;  
  28.   case "b_area":  
  29.  condition = nvcParam[key];  
  30.  searchPredicate = searchPredicate.And(u =>  
  31.  u.B_area.Contains(condition));  
  32.  break;  
  33.   case "c_clinchdate":  
  34.  condition = nvcParam[key];  
  35.  searchPredicate = searchPredicate.And(u =>   
  36. u.C_clinchdate.Contains(condition));  
  37.  break;  
  38.   default:  
  39.  break;  
  40. }  
  41. }  
  42.  
  43. return Consulting.Instance.UserT_TractInfo.  
  44. Where(searchPredicate).OrderByDescending(t => t.ID).  
  45. Skip(startIndex - 1).Take(pageSize).ToList();  

下面是我写了注释后的PredicateExtensions,我说不清楚构造函数的True和False具体是怎么起作用的,但结果就是我的注释那样,在复合查询写条件时很重要(不过目前全写AND就完成复合查询了,我还没搞多关键词OR的那种):

  1. /// <summary>  
  2. /// 构造函数使用True时:单个AND有效,多个AND有效;  
  3. ///单个OR无效,多个OR无效;混合时写在AND后的OR有效  
  4. /// 构造函数使用False时:单个AND无效,多个AND无效;  
  5. ///单个OR有效,多个OR有效;混合时写在OR后面的AND有效  
  6. /// </summary>  
  7. public static class PredicateExtensions  
  8. {  
  9. public static Expression<Func<T,   
  10. bool>> True<T>() { return f => true; }  
  11.  
  12. public static Expression<Func<T, bool>> False<T>() {   
  13. return f => false; }  
  14. public static Expression<Func<T, bool>>  
  15.  Or<T>(this Expression<Func<T, bool>> expression1,   
  16. Expression<Func<T, bool>> expression2)  
  17. {  
  18. var invokedExpression = Expression.Invoke(  
  19. expression2, expression1.Parameters.Cast<Expression>());  
  20.  
  21. return Expression.Lambda<Func<T, bool>>(  
  22. Expression.Or(expression1.Body,   
  23. invokedExpression),   
  24. expression1.Parameters);  
  25. }  
  26.  
  27. public static Expression<Func<T, bool>> And<T>(  
  28. this Expression<Func<T, bool>> expression1,   
  29. Expression<Func<T, bool>> expression2)  
  30. {  
  31. var invokedExpression =   
  32. Expression.Invoke(expression2,   
  33. expression1.Parameters.Cast<Expression>());  
  34.  
  35. return Expression.Lambda<Func<T, bool>>  
  36. (Expression.And(expression1.Body, invokedExpression),  
  37.  expression1.Parameters);  
  38. }  
  39. }  

原文来自:http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html

LINQ模糊查询实现复合搜索的基本内容就向你介绍到这里,希望对你了解和掌握复合搜索的LINQ模糊查询实现有所帮助。

【编辑推荐】

  1. 学习LINQ基本操作的一点体会
  2. LINQ删除记录实战解析
  3. 浅析LINQ嵌套的实现过程
  4. LINQ嵌套实战案例分析
  5. LINQ模糊查询应用实例分析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-09-14 18:19:49

LINQ模糊查询

2009-09-10 14:47:53

Linq .NET查询

2009-09-15 09:19:22

linq动态条件

2009-09-17 18:05:15

linq to sql

2009-09-14 18:23:59

LINQ嵌套查询

2009-09-14 17:03:32

LINQ模糊查询

2009-09-15 17:16:58

LINQ查询操作符

2009-09-15 10:35:11

linq多表查询

2009-09-14 19:14:51

LINQ动态查询

2009-09-14 18:06:18

LINQ模糊查询

2009-09-08 16:36:10

LINQ查询基于泛型类

2009-09-13 21:52:16

LINQ字符串

2009-09-16 17:29:10

Linq查询二维数组

2009-09-16 13:02:12

LINQ查询子句

2009-09-17 09:09:50

Lambda表达式Linq查询

2009-09-15 14:30:11

Linq连接

2009-07-22 11:27:36

iBATIS模糊查询

2009-09-14 18:57:19

LINQ查询

2009-09-17 16:20:43

Linq to sql

2009-09-17 13:30:32

LINQ to XML
点赞
收藏

51CTO技术栈公众号