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

  • 相关阅读:
    Python 存储引擎 数据类型 主键
    Python 数据库
    Python 线程池进程池 异步回调 协程 IO模型
    Python GIL锁 死锁 递归锁 event事件 信号量
    Python 进程间通信 线程
    Python 计算机发展史 多道技术 进程 守护进程 孤儿和僵尸进程 互斥锁
    Python 异常及处理 文件上传事例 UDP socketserver模块
    Python socket 粘包问题 报头
    Django基础,Day7
    Django基础,Day6
  • 原文地址:https://www.cnblogs.com/aguan/p/4063249.html
Copyright © 2011-2022 走看看