简单解决Linq多条件组合问题

开发 后端
最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程搬过来..昨天写评价功能的时候,碰到个Linq多条件叠加组合的问题,具体解决方法看下文。

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

最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程搬过来..昨天写评价功能的时候,碰到个Linq多条件叠加组合的问题,其需求如下:

多种查询评价的条件:

1.Linq多条件之查询类型:

收到的评价_买家给我的评价,收到的评价_卖家给我的评价,给出的评价_我给买家的评价,给出的评价_我给卖家的评价

  1. public enum OpinionSearchType  
  2. {  
  3.    收到的评价_买家给我的评价 = 0,  
  4.     收到的评价_卖家给我的评价 = 1,  
  5.     给出的评价_我给买家的评价 = 2,  
  6.     给出的评价_我给卖家的评价 = 3  
  7. }  

2.Linq多条件之评价类型:

全部,好评,中评,差评

  1. public enum OpinionType  
  2. {  
  3.    全部 = 0,  
  4.    好评 = 1,  
  5.    中评 = 2,  
  6.    差评 = 3  

3.Linq多条件之评价查询时间:

全部,一个星期内,一个月以内,六个月以内,六个月以外

  1. public enum OpinionTime  
  2. {  
  3.      全部 = 0,  
  4.      一个星期内 = 1,  
  5.      一个月以内 = 2,  
  6.      六个月以内 = 3,  
  7.      六个月以外 = 4  

由于缓存的需要,要把Expression完成之后再传到接口那边获取相应的List<评价意见>.按照这样的看的话,

总共3个条件, 13个子条件, 排列组合之后, 会有80种的组合. - - 真的一个个组合去写的话,还真是累死人了..

左思右想,***的方法就是把3个条件都拆开来,完成不同的Expression,到***再把三个条件组合在一起成为一个新的Expression.网上找到的比较都只是单条件的Parameter, 查了MSDN,才知道有个Expression.And(left, right)可以完成我的需求.利用.net3.5的扩展方法写成了一个组合Expression的方法,再重载了几个多参数的表达式,如下:

  1. #region 表达式  
  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  

有了这几个方法进行Linq多条件查询,原本的需求就可以迎刃而解了:

  1. Expressionbool>> expSearchType = null;  
  2.  Expressionbool>> expOpinionType = null;  
  3. Expressionbool>> expOpinionTime = null;  
  4. switch (searchType) {  
  5.     case OpinionSearchType.给出的评价_我给买家的评价:  
  6.         expSearchType = Y => Y.UserID == userID && !Y.IsSeller;  
  7.          break;  
  8.     case OpinionSearchType.给出的评价_我给卖家的评价:  
  9.       expSearchType = Y => Y.UserID == userID && Y.IsSeller;  
  10.         break;  
  11.      case OpinionSearchType.收到的评价_买家给我的评价:  
  12.         expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
  13.         break;  
  14.     case OpinionSearchType.收到的评价_卖家给我的评价:  
  15.         expSearchType = Y => Y.ToUserID == userID && !Y.IsSeller;  
  16.          break;  
  17.  }  
  18.  switch (opinType) {  
  19.      case OpinionType.好评:  
  20.          expOpinionType = Y => Y.OpinionType == 0;  
  21.          break;  
  22.     case OpinionType.中评:  
  23.          expOpinionType = Y => Y.OpinionType == 1;  
  24.          break;  
  25.      case OpinionType.差评:  
  26.          expOpinionType = Y => Y.OpinionType == 2;  
  27.          break;  
  28.  }   
  29.  switch (opinTime) {  
  30.      case OpinionTime.一个星期内:  
  31.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 7;  
  32.          break;  
  33.      case OpinionTime.一个月以内:  
  34.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 30;  
  35.          break;  
  36.      case OpinionTime.六个月以内:  
  37.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days <= 180;  
  38.          break;  
  39.      case OpinionTime.六个月以外:  
  40.          expOpinionTime = Y => (DateTime.Now - Y.OpinionTime).Days > 180;  
  41.          break;  
  42.  }  
  43.   //GetPaged(params) 这个方法是用来获取列表并支持缓存保存的.  
  44.  return GetPaged(expSearchType.ContactExpressionsbool>(expOpinionType, expOpinionTime),  
  45.      userID.UserTablePrefx(), true, pageIndex, pageSize); 

以上就是通过Linq实例解析Linq的另类用法,然后解决Linq多条件组合问题。

【编辑推荐】

  1. 为你揭晓 Linq更新数据是否真的实用?
  2. 深度剖析linq级联删除
  3. 简单实现Linq连接查询
  4. LINQ动态查询的实现浅析
  5. 简单实现Linq多条件查询
责任编辑:阡陌 来源: 51CTO.com
相关推荐

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语句

2009-09-15 15:09:50

Linq本质

2009-09-11 09:41:19

LINQ to SQL

2009-09-08 10:50:20

2009-09-09 15:28:43

Linq to obj

2009-09-15 16:26:36

Linq orderb

2009-09-10 16:28:17

LINQ查询

2009-09-18 16:00:07

LINQ架构

2009-09-09 14:20:49

LINQ To Luc

2009-09-14 10:57:46

LINQ入门

2009-09-08 13:16:01

Linq to SQL

2009-09-15 09:19:22

linq动态条件

2009-09-07 22:29:04

LINQ组合查询

2009-09-15 09:39:38

LINQ查询架构

2009-09-15 13:37:24

Linq To Sql
点赞
收藏

51CTO技术栈公众号