自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

LINQ模糊查詢學(xué)習(xí)體驗(yàn)淺析

開發(fā) 后端
LINQ模糊查詢的實(shí)際應(yīng)用是什么呢?那么這里向你介紹一個(gè)具體的使用實(shí)例,我們將會(huì)看到LINQ模糊查詢的具體實(shí)現(xiàn)步驟以及思路,想對(duì)你學(xué)習(xí)LINQ模糊查詢有所幫助。

LINQ模糊查詢來實(shí)現(xiàn)復(fù)合搜索的功能,具體的操作過程是什么呢?在這里向你介紹一下處理過程,使用LINQ模糊查詢有什么需要注意的呢?那么我們通過這個(gè)例子希望對(duì)你有所啟發(fā)。

LINQ模糊查詢實(shí)現(xiàn)的多條件復(fù)合搜索效果如下圖:

LINQ模糊查詢實(shí)現(xiàn)的多條件復(fù)合搜索效果 

LINQ模糊查詢實(shí)現(xiàn)階段一:

首先是找到了李永京(YJingLee)前輩的《LINQ體驗(yàn)(17)——LINQ to SQL語(yǔ)句之動(dòng)態(tài)查詢》一文,利用Lambda表達(dá)式樹可以進(jìn)行動(dòng)態(tài)查詢。寫了個(gè)方法進(jìn)行復(fù)合查詢,動(dòng)態(tài)組合條件,生成Lambda表達(dá)式。

  1. /// <summary>  
  2. /// 這個(gè)方法帶分頁(yè)功能,通過輸入的鍵值對(duì)NVC進(jìn)行復(fù)合查詢  
  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. //當(dāng)對(duì)象存在此屬性時(shí)(因?yàn)殒I值對(duì)可能還有很多其他的參數(shù),例如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組合了各個(gè)有效的鍵值對(duì)對(duì)應(yīng)的conditionExpression,  
  46. //復(fù)合查詢最重要的組合工作就這么完了  
  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();//查詢出結(jié)果  
  59. }  
  60. else 
  61. {  
  62. return Consulting.Instance.UserT_TractInfo.  
  63. OrderByDescending(t => t.ID).Skip(startIndex - 1).  
  64. Take(pageSize).ToList();  
  65. //如果沒有有效鍵值對(duì),則返回全部結(jié)果  
  66. }  
  67. }  

搞了半天本來很興奮的,之后才知道Lambda表達(dá)式是寫不出.Contains()的,我的心瓦涼瓦涼的。

LINQ模糊查詢實(shí)現(xiàn)階段二:

雖然李永京的文章沒給我多少幫助,但它后面有個(gè)回復(fù)很有價(jià)值:“用微軟提供的System.Linq.Dynamic方便點(diǎn)?!焙芸煺业搅藢?duì)應(yīng)例子和Dynamic.cs,也找到了《Linq to SQL Dynamic 動(dòng)態(tài)查詢》,有更細(xì)致的例子,可惜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模糊查詢實(shí)現(xiàn)階段三:

中文的實(shí)在是找不到了,在MS的官方BBS上找到了個(gè)鏈接,非常有用!《dynamic linq queries / dynamic where clause (part 2) 》,這個(gè)老外擴(kuò)展了Dynamic.cs,寫了個(gè)PredicateExtensions類,雖然不知道他是怎么想出來的,但確實(shí)有效!

這里放出核心代碼,很容易看懂,簡(jiǎn)單就是美!

  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,我說不清楚構(gòu)造函數(shù)的True和False具體是怎么起作用的,但結(jié)果就是我的注釋那樣,在復(fù)合查詢寫條件時(shí)很重要(不過目前全寫AND就完成復(fù)合查詢了,我還沒搞多關(guān)鍵詞OR的那種):

  1. /// <summary>  
  2. /// 構(gòu)造函數(shù)使用True時(shí):?jiǎn)蝹€(gè)AND有效,多個(gè)AND有效;  
  3. ///單個(gè)OR無效,多個(gè)OR無效;混合時(shí)寫在AND后的OR有效  
  4. /// 構(gòu)造函數(shù)使用False時(shí):?jiǎn)蝹€(gè)AND無效,多個(gè)AND無效;  
  5. ///單個(gè)OR有效,多個(gè)OR有效;混合時(shí)寫在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模糊查詢實(shí)現(xiàn)復(fù)合搜索的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和掌握復(fù)合搜索的LINQ模糊查詢實(shí)現(xiàn)有所幫助。

【編輯推薦】

  1. 學(xué)習(xí)LINQ基本操作的一點(diǎn)體會(huì)
  2. LINQ刪除記錄實(shí)戰(zhàn)解析
  3. 淺析LINQ嵌套的實(shí)現(xiàn)過程
  4. LINQ嵌套實(shí)戰(zhàn)案例分析
  5. LINQ模糊查詢應(yīng)用實(shí)例分析
責(zé)任編輯:仲衡 來源: 博客園
相關(guān)推薦

2009-09-14 18:19:49

LINQ模糊查詢

2009-09-14 18:23:59

LINQ嵌套查詢

2009-09-17 18:05:15

linq to sql

2009-09-15 09:19:22

linq動(dòng)態(tài)條件

2009-09-10 14:47:53

Linq .NET查詢

2009-09-14 17:03:32

LINQ模糊查詢

2009-09-14 19:14:51

LINQ動(dòng)態(tài)查詢

2009-09-15 17:16:58

LINQ查詢操作符

2009-09-15 10:35:11

linq多表查詢

2009-09-14 18:06:18

LINQ模糊查詢

2009-09-16 17:29:10

Linq查詢二維數(shù)組

2009-09-13 21:52:16

LINQ字符串

2009-09-08 16:36:10

LINQ查詢基于泛型類

2009-09-17 09:09:50

Lambda表達(dá)式Linq查詢

2009-09-15 14:30:11

Linq連接

2009-09-16 13:02:12

LINQ查詢子句

2009-09-14 18:57:19

LINQ查詢

2009-09-16 15:33:22

LINQ to XML

2009-09-07 16:44:28

Linq String

2009-09-15 13:30:54

linq級(jí)聯(lián)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)