日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
LINQ模糊查詢學(xué)習(xí)體驗(yàn)淺析

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

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、做網(wǎng)站、中站網(wǎng)絡(luò)推廣、小程序開發(fā)、中站網(wǎng)絡(luò)營(yíng)銷、中站企業(yè)策劃、中站品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供中站建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

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. /// 
  2. /// 這個(gè)方法帶分頁(yè)功能,通過輸入的鍵值對(duì)NVC進(jìn)行復(fù)合查詢
  3. /// 
  4. List GetPagedObjectsByNVC(
  5. int startIndex, int pageSize, 
  6. NameValueCollection nvc, bool isAnd)
  7. {
  8. IQueryable query = 
  9. Consulting.Instance.UserT_TractInfo;
  10. query.Where(t => t.IsDel == 0).
  11. Where(t => t.IsAuditing == 1);//審核和邏輯刪除
  12. Expression condition = null;
  13. ParameterExpression param = Expression.
  14. Parameter(typeof(UserT_TractInfo), "c");
  15. int propertyCount = 0;
  16. foreach (string key in nvc)
  17. {
  18. Expression right = Expression.Constant(nvc[key]);//鍵
  19. string keyProperty = key;//屬性
  20. if (typeof(UserT_TractInfo).GetProperty(keyProperty) != null)
  21. //當(dāng)對(duì)象存在此屬性時(shí)(因?yàn)殒I值對(duì)可能還有很多其他的參數(shù),例如page)
  22. {
  23.   Expression left = Expression.Property(param,
  24. typeof(UserT_TractInfo).GetProperty(keyProperty));//建立屬性
  25.   Expression filter = Expression.Equal(left, right);//過濾器
  26.   if (condition == null)
  27.   {
  28. condition = filter;
  29.   }
  30.   else
  31.   {
  32.  if (isAnd)
  33.  {
  34. condition = Expression.And(condition, filter);
  35.  }
  36.  else
  37.  {
  38. condition = Expression.Or(condition, filter);
  39.  }
  40.   }
  41.   propertyCount++;
  42. }
  43. }
  44. //以上foreach組合了各個(gè)有效的鍵值對(duì)對(duì)應(yīng)的conditionExpression,
  45. //復(fù)合查詢最重要的組合工作就這么完了
  46. if (propertyCount > 0)
  47. {
  48. Expression pred = Expression.Lambda(condition, param);
  49. MethodCallExpression whereCallExpression = 
  50. Expression.Call(typeof(Queryable), "Where", 
  51. new Type[] { typeof(UserT_TractInfo) },
  52.  Expression.Constant(query), pred);
  53. return Consulting.Instance.UserT_TractInfo.AsQueryable().
  54. Provider.CreateQuery(whereCallExpression).
  55. OrderByDescending(t => t.ID).Skip(startIndex - 1).
  56. Take(pageSize).ToList();//查詢出結(jié)果
  57. }
  58. else
  59. {
  60. return Consulting.Instance.UserT_TractInfo.
  61. OrderByDescending(t => t.ID).Skip(startIndex - 1).
  62. Take(pageSize).ToList();
  63. //如果沒有有效鍵值對(duì),則返回全部結(jié)果
  64. }
  65. }

搞了半天本來很興奮的,之后才知道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();
  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. return Consulting.Instance.UserT_TractInfo.
  43. Where(searchPredicate).OrderByDescending(t => t.ID).
  44. Skip(startIndex - 1).Take(pageSize).ToList();

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

 
 
 
 
  1. /// 
  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. /// 
  7. public static class PredicateExtensions
  8. {
  9. public static Expression
  10. bool>> True() { return f => true; }
  11. public static Expression> False() { 
  12. return f => false; }
  13. public static Expression>
  14.  Or(this Expression> expression1, 
  15. Expression> expression2)
  16. {
  17. var invokedExpression = Expression.Invoke(
  18. expression2, expression1.Parameters.Cast());
  19. return Expression.Lambda>(
  20. Expression.Or(expression1.Body, 
  21. invokedExpression), 
  22. expression1.Parameters);
  23. }
  24. public static Expression> And(
  25. this Expression> expression1, 
  26. Expression> expression2)
  27. {
  28. var invokedExpression = 
  29. Expression.Invoke(expression2, 
  30. expression1.Parameters.Cast());
  31. return Expression.Lambda>
  32. (Expression.And(expression1.Body, invokedExpression),
  33.  expression1.Parameters);
  34. }
  35. }

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

LINQ模糊查詢實(shí)現(xiàn)復(fù)合搜索的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和掌握復(fù)合搜索的LINQ模糊查詢實(shí)現(xiàn)有所幫助。


網(wǎng)站欄目:LINQ模糊查詢學(xué)習(xí)體驗(yàn)淺析
當(dāng)前網(wǎng)址:http://m.5511xx.com/article/dpogegd.html