zoukankan      html  css  js  c++  java
  • 转 --简单解决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<func> 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<func>)exp;  
    15.  }  
    16.  
    17.  public static Expression<func<t1, t>> ContactExpressions<t1, t>(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<func<t1, t>>)exp;  
    23.  }  
    24.  public static Expression<func<t1, t2, t>> ContactExpressions<t1, t2, t>(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<func<t1, t2, t>>)exp;  
    30.  }  
    31.    
    32.  public static Expression<func<t1, t2, t3, t>> ContactExpressions<t1, t2, t3, t>(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<func<t1, t2, t3, t>>)exp;  
    39.  }  
    40.    
    41. #endregion  

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

    1. Expression<func<split_opinion, < span="">bool>> expSearchType = null;  
    2.  Expression<func<split_opinion, < span="">bool>> expOpinionType = null;  
    3. Expression<func<split_opinion, < span="">bool>> 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.ContactExpressions<split_opinion, < span="">bool>(expOpinionType, expOpinionTime),  
    45.      userID.UserTablePrefx(), true, pageIndex, pageSize); 

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

    原文地址:http://developer.51cto.com/art/200909/151931.htm

  • 相关阅读:
    百度地图地址解析/逆地址解析
    Oracle表空间创建要点
    dubbo——providers
    dubbo——常用标签属性
    dubbo——spring初始化
    dubbo——RPC
    mybatis——datasource
    redis——再补充
    mybatis——缓存
    mybatis——Executor
  • 原文地址:https://www.cnblogs.com/aguan/p/4063249.html
Copyright © 2011-2022 走看看