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

簡(jiǎn)單解決Linq多條件組合問(wèn)題

開發(fā) 后端
最近有個(gè)項(xiàng)目準(zhǔn)備功能改版,師兄吩咐:盡可能地做到萬(wàn)般皆Linq,所以很多東西都要從存儲(chǔ)過(guò)程搬過(guò)來(lái)..昨天寫評(píng)價(jià)功能的時(shí)候,碰到個(gè)Linq多條件疊加組合的問(wèn)題,具體解決方法看下文。

本文筆者用清晰的實(shí)例,解決了Linq多條件問(wèn)題,思路十分的清晰,筆者也很細(xì)心的做了描述,希望能給你帶來(lái)幫助。

最近有個(gè)項(xiàng)目準(zhǔn)備功能改版,師兄吩咐:盡可能地做到萬(wàn)般皆Linq,所以很多東西都要從存儲(chǔ)過(guò)程搬過(guò)來(lái)..昨天寫評(píng)價(jià)功能的時(shí)候,碰到個(gè)Linq多條件疊加組合的問(wèn)題,其需求如下:

多種查詢?cè)u(píng)價(jià)的條件:

1.Linq多條件之查詢類型:

收到的評(píng)價(jià)_買家給我的評(píng)價(jià),收到的評(píng)價(jià)_賣家給我的評(píng)價(jià),給出的評(píng)價(jià)_我給買家的評(píng)價(jià),給出的評(píng)價(jià)_我給賣家的評(píng)價(jià)

  1. public enum OpinionSearchType  
  2. {  
  3.    收到的評(píng)價(jià)_買家給我的評(píng)價(jià) = 0,  
  4.     收到的評(píng)價(jià)_賣家給我的評(píng)價(jià) = 1,  
  5.     給出的評(píng)價(jià)_我給買家的評(píng)價(jià) = 2,  
  6.     給出的評(píng)價(jià)_我給賣家的評(píng)價(jià) = 3  
  7. }  

2.Linq多條件之評(píng)價(jià)類型:

全部,好評(píng),中評(píng),差評(píng)

  1. public enum OpinionType  
  2. {  
  3.    全部 = 0,  
  4.    好評(píng) = 1,  
  5.    中評(píng) = 2,  
  6.    差評(píng) = 3  

3.Linq多條件之評(píng)價(jià)查詢時(shí)間:

全部,一個(gè)星期內(nèi),一個(gè)月以內(nèi),六個(gè)月以內(nèi),六個(gè)月以外

  1. public enum OpinionTime  
  2. {  
  3.      全部 = 0,  
  4.      一個(gè)星期內(nèi) = 1,  
  5.      一個(gè)月以內(nèi) = 2,  
  6.      六個(gè)月以內(nèi) = 3,  
  7.      六個(gè)月以外 = 4  

由于緩存的需要,要把Expression完成之后再傳到接口那邊獲取相應(yīng)的List<評(píng)價(jià)意見>.按照這樣的看的話,

總共3個(gè)條件, 13個(gè)子條件, 排列組合之后, 會(huì)有80種的組合. - - 真的一個(gè)個(gè)組合去寫的話,還真是累死人了..

左思右想,***的方法就是把3個(gè)條件都拆開來(lái),完成不同的Expression,到***再把三個(gè)條件組合在一起成為一個(gè)新的Expression.網(wǎng)上找到的比較都只是單條件的Parameter, 查了MSDN,才知道有個(gè)Expression.And(left, right)可以完成我的需求.利用.net3.5的擴(kuò)展方法寫成了一個(gè)組合Expression的方法,再重載了幾個(gè)多參數(shù)的表達(dá)式,如下:

  1. #region 表達(dá)式  
  2. public static Expression ContactExpressions(this Expression exp, params Expression[] exps) {  
  3.     foreach (var e in exps) {  
  4.          if (null == e) continue;  
  5.           exp = Expression.And(exp, e);  
  6.       }  
  7.       return exp;  
  8.   }  
  9.   public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) {  
  10.     foreach (var e in exps) {  
  11.          if (null == e) continue;  
  12.         exp = Expression.And(exp, e);  
  13.     }  
  14.      return (Expression>)exp;  
  15.  }  
  16.  
  17.  public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) {  
  18.     foreach (var e in exps) {  
  19.          if (null == e) continue;  
  20.          exp = Expression.And(exp, e);  
  21.      }  
  22.      return (Expression>)exp;  
  23.  }  
  24.  public static Expression> ContactExpressions(this Expression exp, params Expression[] exps) {  
  25.      foreach (var e in exps) {  
  26.         if (null == e) continue;  
  27.          exp = Expression.And(exp, e);  
  28.     }  
  29.      return (Expression>)exp;  
  30.  }  
  31.    
  32.  public static Expression> ContactExpressions(this Expression exp,
  33.  params Expression[] exps) {  
  34.      foreach (var e in exps) {  
  35.          if (null == e) continue;  
  36.          exp = Expression.And(exp, e);  
  37.     }  
  38.      return (Expression>)exp;  
  39.  }  
  40.    
  41. #endregion  

有了這幾個(gè)方法進(jìn)行Linq多條件查詢,原本的需求就可以迎刃而解了:

  1. Expressionbool>> expSearchType = null;  
  2.  Expressionbool>> expOpinionType = null;  
  3. Expressionbool>> expOpinionTime = null;  
  4. switch (searchType) {  
  5.     case OpinionSearchType.給出的評(píng)價(jià)_我給買家的評(píng)價(jià):  
  6.         expSearchType = Y => Y.UserID == userID && !Y.IsSeller;  
  7.          break;  
  8.     case OpinionSearchType.給出的評(píng)價(jià)_我給賣家的評(píng)價(jià):  
  9.       expSearchType = Y => Y.UserID == userID && Y.IsSeller;  
  10.         break;  
  11.      case OpinionSearchType.收到的評(píng)價(jià)_買家給我的評(píng)價(jià):  
  12.         expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
  13.         break;  
  14.     case OpinionSearchType.收到的評(píng)價(jià)_賣家給我的評(píng)價(jià):  
  15.         expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
  16.          break;  
  17.  }  
  18.  switch (opinType) {  
  19.      case OpinionType.好評(píng):  
  20.          expOpinionType = Y => Y.OpinionType == 0;  
  21.          break;  
  22.     case OpinionType.中評(píng):  
  23.          expOpinionType = Y => Y.OpinionType == 1;  
  24.          break;  
  25.      case OpinionType.差評(píng):  
  26.          expOpinionType = Y => Y.OpinionType == 2;  
  27.          break;  
  28.  }   
  29.  switch (opinTime) {  
  30.      case OpinionTime.一個(gè)星期內(nèi):  
  31.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7;  
  32.          break;  
  33.      case OpinionTime.一個(gè)月以內(nèi):  
  34.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30;  
  35.          break;  
  36.      case OpinionTime.六個(gè)月以內(nèi):  
  37.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180;  
  38.          break;  
  39.      case OpinionTime.六個(gè)月以外:  
  40.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180;  
  41.          break;  
  42.  }  
  43.   //GetPaged(params) 這個(gè)方法是用來(lái)獲取列表并支持緩存保存的.  
  44.  return GetPaged(expSearchType.ContactExpressionsbool>(expOpinionType, expOpinionTime),  
  45.      userID.UserTablePrefx(), true, pageIndex, pageSize); 

以上就是通過(guò)Linq實(shí)例解析Linq的另類用法,然后解決Linq多條件組合問(wèn)題。

【編輯推薦】

  1. 為你揭曉 Linq更新數(shù)據(jù)是否真的實(shí)用?
  2. 深度剖析linq級(jí)聯(lián)刪除
  3. 簡(jiǎn)單實(shí)現(xiàn)Linq連接查詢
  4. LINQ動(dòng)態(tài)查詢的實(shí)現(xiàn)淺析
  5. 簡(jiǎn)單實(shí)現(xiàn)Linq多條件查詢
責(zé)任編輯:阡陌 來(lái)源: 51CTO.com
相關(guān)推薦

2009-09-15 11:34:47

Linq多條件查詢

2009-09-15 09:33:46

linq多條件查詢

2009-09-14 10:54:07

LINQ解決方案

2010-04-28 16:45:27

Oracle Inst

2009-09-07 21:25:59

Linq自定義

2009-09-10 09:35:25

Linq語(yǔ)句

2009-09-15 15:09:50

Linq本質(zhì)

2009-09-08 10:50:20

2009-09-11 09:41:19

LINQ to SQL

2009-09-14 10:57:46

LINQ入門

2009-09-08 13:16:01

Linq to SQL

2009-09-09 14:20:49

LINQ To Luc

2009-09-09 15:28:43

Linq to obj

2009-09-15 16:26:36

Linq orderb

2009-09-18 16:00:07

LINQ架構(gòu)

2009-09-10 16:28:17

LINQ查詢

2009-09-15 09:19:22

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

2009-09-07 22:29:04

LINQ組合查詢

2009-09-11 10:20:36

Linq擴(kuò)展方法

2009-09-09 09:36:25

Linq對(duì)象引用
點(diǎn)贊
收藏

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