您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何解決Linq多條件組合問題”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何解決Linq多條件組合問題”這篇文章吧。
多種查詢評價的條件:
1.Linq多條件之查詢類型:
收到的評價_買家給我的評價,收到的評價_賣家給我的評價,給出的評價_我給買家的評價,給出的評價_我給賣家的評價
public enum OpinionSearchType { 收到的評價_買家給我的評價 = 0, 收到的評價_賣家給我的評價 = 1, 給出的評價_我給買家的評價 = 2, 給出的評價_我給賣家的評價 = 3 }
2.Linq多條件之評價類型:
全部,好評,中評,差評
public enum OpinionType { 全部 = 0, 好評 = 1, 中評 = 2, 差評 = 3 }
3.Linq多條件之評價查詢時間:
全部,一個星期內,一個月以內,六個月以內,六個月以外
public enum OpinionTime { 全部 = 0, 一個星期內 = 1, 一個月以內 = 2, 六個月以內 = 3, 六個月以外 = 4 }
由于緩存的需要,要把Expression完成之后再傳到接口那邊獲取相應的List<評價意見>.按照這樣的看的話,
總共3個條件, 13個子條件, 排列組合之后, 會有80種的組合. - - 真的一個個組合去寫的話,還真是累死人了..
左思右想,***的方法就是把3個條件都拆開來,完成不同的Expression,到***再把三個條件組合在一起成為一個新的Expression.網上找到的比較都只是單條件的Parameter, 查了MSDN,才知道有個Expression.And(left, right)可以完成我的需求.利用.net3.5的擴展方法寫成了一個組合Expression的方法,再重載了幾個多參數的表達式,如下:
#region 表達式 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<Func> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression<Func>)exp; } public static Expression<Func> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression<Func>)exp; } public static Expression<Func> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression<Func>)exp; } public static Expression<Func> ContactExpressions(this Expression exp, params Expression[] exps) { foreach (var e in exps) { if (null == e) continue; exp = Expression.And(exp, e); } return (Expression<Func>)exp; } #endregion
有了這幾個方法進行Linq多條件查詢,原本的需求就可以迎刃而解了:
Expression<Func<split_Opinion, bool>> expSearchType = null; Expression<Func<split_Opinion, bool>> expOpinionType = null; Expression<Func<split_Opinion, bool>> expOpinionTime = null; switch (searchType) { case OpinionSearchType.給出的評價_我給買家的評價: expSearchType = Y => Y.UserID == userID && !Y.IsSeller; break; case OpinionSearchType.給出的評價_我給賣家的評價: expSearchType = Y => Y.UserID == userID && Y.IsSeller; break; case OpinionSearchType.收到的評價_買家給我的評價: expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller; break; case OpinionSearchType.收到的評價_賣家給我的評價: expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller; break; } switch (opinType) { case OpinionType.好評: expOpinionType = Y => Y.OpinionType == 0; break; case OpinionType.中評: expOpinionType = Y => Y.OpinionType == 1; break; case OpinionType.差評: expOpinionType = Y => Y.OpinionType == 2; break; } switch (opinTime) { case OpinionTime.一個星期內: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7; break; case OpinionTime.一個月以內: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30; break; case OpinionTime.六個月以內: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180; break; case OpinionTime.六個月以外: expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180; break; } //GetPaged(params) 這個方法是用來獲取列表并支持緩存保存的. return GetPaged(expSearchType.ContactExpressions<split_Opinion, bool>(expOpinionType, expOpinionTime), userID.UserTablePrefx(), true, pageIndex, pageSize);
以上是“如何解決Linq多條件組合問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。