本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助。

最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆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 > 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
 
有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:
- Expression bool>> expSearchType = null;
 - Expression bool>> expOpinionType = null;
 - Expression 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 bool>(expOpinionType, expOpinionTime),
 - userID.UserTablePrefx(), true, pageIndex, pageSize);
 
以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。
                当前标题:简单解决Linq多条件组合问题
                
                标题URL:http://www.csdahua.cn/qtweb/news48/355248.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网