簡(jiǎn)單解決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à)
- public enum OpinionSearchType
- {
- 收到的評(píng)價(jià)_買家給我的評(píng)價(jià) = 0,
- 收到的評(píng)價(jià)_賣家給我的評(píng)價(jià) = 1,
- 給出的評(píng)價(jià)_我給買家的評(píng)價(jià) = 2,
- 給出的評(píng)價(jià)_我給賣家的評(píng)價(jià) = 3
- }
2.Linq多條件之評(píng)價(jià)類型:
全部,好評(píng),中評(píng),差評(píng)
- public enum OpinionType
- {
- 全部 = 0,
- 好評(píng) = 1,
- 中評(píng) = 2,
- 差評(píng) = 3
- }
3.Linq多條件之評(píng)價(jià)查詢時(shí)間:
全部,一個(gè)星期內(nèi),一個(gè)月以內(nèi),六個(gè)月以內(nèi),六個(gè)月以外
- public enum OpinionTime
- {
- 全部 = 0,
- 一個(gè)星期內(nèi) = 1,
- 一個(gè)月以內(nèi) = 2,
- 六個(gè)月以內(nèi) = 3,
- 六個(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á)式,如下:
- #region 表達(dá)式
- public static Expression ContactExpressions(this Expression exp, params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return exp;
- }
- public static Expression
> ContactExpressions this Expression exp, params Expression[] exps) {( - foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression
>)exp; - }
- public static Expression
> ContactExpressions this Expression exp, params Expression[] exps) {( - foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression
>)exp; - }
- public static Expression
> ContactExpressions this Expression exp, params Expression[] exps) {( - foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression
>)exp; - }
- public static Expression
> ContactExpressions this Expression exp,( - params Expression[] exps) {
- foreach (var e in exps) {
- if (null == e) continue;
- exp = Expression.And(exp, e);
- }
- return (Expression
>)exp; - }
- #endregion
有了這幾個(gè)方法進(jìn)行Linq多條件查詢,原本的需求就可以迎刃而解了:
- Expression
bool>> expSearchType = null; - Expression
bool>> expOpinionType = null; - Expression
bool>> expOpinionTime = null; - switch (searchType) {
- case OpinionSearchType.給出的評(píng)價(jià)_我給買家的評(píng)價(jià):
- expSearchType = Y => Y.UserID == userID && !Y.IsSeller;
- break;
- case OpinionSearchType.給出的評(píng)價(jià)_我給賣家的評(píng)價(jià):
- expSearchType = Y => Y.UserID == userID && Y.IsSeller;
- break;
- case OpinionSearchType.收到的評(píng)價(jià)_買家給我的評(píng)價(jià):
- expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;
- break;
- case OpinionSearchType.收到的評(píng)價(jià)_賣家給我的評(píng)價(jià):
- expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;
- break;
- }
- switch (opinType) {
- case OpinionType.好評(píng):
- expOpinionType = Y => Y.OpinionType == 0;
- break;
- case OpinionType.中評(píng):
- expOpinionType = Y => Y.OpinionType == 1;
- break;
- case OpinionType.差評(píng):
- expOpinionType = Y => Y.OpinionType == 2;
- break;
- }
- switch (opinTime) {
- case OpinionTime.一個(gè)星期內(nèi):
- expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7;
- break;
- case OpinionTime.一個(gè)月以內(nèi):
- expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30;
- break;
- case OpinionTime.六個(gè)月以內(nèi):
- expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180;
- break;
- case OpinionTime.六個(gè)月以外:
- expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180;
- break;
- }
- //GetPaged(params) 這個(gè)方法是用來(lái)獲取列表并支持緩存保存的.
- return GetPaged(expSearchType.ContactExpressions
bool>(expOpinionType, expOpinionTime), - userID.UserTablePrefx(), true, pageIndex, pageSize);
以上就是通過(guò)Linq實(shí)例解析Linq的另類用法,然后解決Linq多條件組合問(wèn)題。
【編輯推薦】