LINQ模糊查询学习体验浅析
创始人
2024-06-07 00:10:51
0

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

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

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

LINQ模糊查询实现阶段一:

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

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

搞了半天本来很兴奋的,之后才知道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();  
  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. ///   
  2. /// 构造函数使用True时:单个AND有效,多个AND有效;  
  3. ///单个OR无效,多个OR无效;混合时写在AND后的OR有效  
  4. /// 构造函数使用False时:单个AND无效,多个AND无效;  
  5. ///单个OR有效,多个OR有效;混合时写在OR后面的AND有效  
  6. /// 
  7.  
  8. public static class PredicateExtensions  
  9. {  
  10. public static Expressionbool>> True() { return f => true; }  
  11.  
  12. public static Expression> False() {   
  13. return f => false; }  
  14. public static Expression>  
  15.  Or(this Expression> expression1,   
  16. Expression> expression2)  
  17. {  
  18. var invokedExpression = Expression.Invoke(  
  19. expression2, expression1.Parameters.Cast());  
  20.  
  21. return Expression.Lambda>(  
  22. Expression.Or(expression1.Body,   
  23. invokedExpression),   
  24. expression1.Parameters);  
  25. }  
  26.  
  27. public static Expression> And(  
  28. this Expression> expression1,   
  29. Expression> expression2)  
  30. {  
  31. var invokedExpression =   
  32. Expression.Invoke(expression2,   
  33. expression1.Parameters.Cast());  
  34.  
  35. return Expression.Lambda>  
  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模糊查询应用实例分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...