本文笔者用清晰的实例,解决了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
  7. }

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

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

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

由于缓存的需要,要把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. public static Expression<func<t1, t>> ContactExpressions<t1, t>(this Expression exp, params Expression[] exps) {
  17. foreach (var e in exps) {
  18. if (null == e) continue;
  19. exp = Expression.And(exp, e);
  20. }
  21. return (Expression<func<t1, t>>)exp;
  22. }
  23. public static Expression<func<t1, t2, t>> ContactExpressions<t1, t2, t>(this Expression exp, params Expression[] exps) {
  24. foreach (var e in exps) {
  25. if (null == e) continue;
  26. exp = Expression.And(exp, e);
  27. }
  28. return (Expression<func<t1, t2, t>>)exp;
  29. }
  30. public static Expression<func<t1, t2, t3, t>> ContactExpressions<t1, t2, t3, t>(this Expression exp,
  31. params Expression[] exps) {
  32. foreach (var e in exps) {
  33. if (null == e) continue;
  34. exp = Expression.And(exp, e);
  35. }
  36. return (Expression<func<t1, t2, t3, t>>)exp;
  37. }
  38. #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

转 --简单解决Linq多条件组合问题的更多相关文章

  1. PredicateBuilder类(linq多条件组合查询)

    PredicateBuilder类如下: public static class PredicateBuilder { /// <summary> /// 机关函数应用True时:单个AN ...

  2. 白话LINQ系列2---以代码演进方式学习LINQ必备条件

    今天,我们通过一个简单的示例代码的演进过程,来学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式:扩展方法:匿名类型.废话不多说,我们直接进入主题. 一.实现 ...

  3. 学习LINQ必备条件

    转自:http://www.cnblogs.com/VolcanoCloud/p/4451302.html 学习LINQ必备条件:隐式类型局部变量:对象集合初始化器:委托:匿名函数:lambda表达式 ...

  4. 安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法(转)

    安装程序无法打开注册表项 UNKNOWN\Components\…的简单解决办法 2018年04月16日 16:41:32 super_star_贤 阅读数:7193   在安装软件时(比如安装SQL ...

  5. AngularJs最简单解决跨域问题案例

    AngularJs最简单解决跨域问题案例 2016-05-20 09:18 82人阅读 评论(0) 收藏 举报  分类: javascript(1)  作者:白狼 出处:http://www.mank ...

  6. ASP.NET MVC 解决LINQ表达式中的SqlMethods 未找到命名空间问题

    右键项目属性下的引用: 添加引用: 搜索寻找——System.Data.Linq,然后添加成功,即可解决LINQ表达式中的SqlMethods 未找到命名空间问题

  7. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

  8. solr的多条件组合查询和solr的范围查询【转】

    solr的多条件组合查询和solr的范围查询 版权声明:本文为博主原创文章,供大家参考,但不要抄袭哦! 存在问题:为了减轻数据库的访问压力,往往我们将必要的数据存储到solr中,并给部分字段建立索引, ...

  9. jsp 多条件组合查询

    web层: public String query(HttpServletRequest request, HttpServletResponse response) throws ServletEx ...

随机推荐

  1. vue.js 使用高德地图

    1.获取key值 注册成为高德开发者需要分三步: 第一步,注册高德开发者: 第二步,去控制台创建应用: 第三步,获取Key 2.修改配置文件  webpack.base.conf.js externa ...

  2. 元素(Element)和结点(Node)的区别(org.w3c.dom)

    1.元素(Element)和结点(Node)的区别, 元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如 - . 但是一个结点不一定是一个元素,而一个元素一定是一个结点. 什么是nod ...

  3. Unity实现支持泛型的事件管理以减少使用object作为参数带来的频繁装拆箱

    如果不用C#自身的event关键字而是要自己实现一个可统一管理游戏中各种消息事件通知管理的系统模块EventManger时,通常都是把事件delegate的参数定义为object类型以适应所有的数据类 ...

  4. [原创]SQL表值函数:获取从当月计算起往前自定义月份数

      今天我现在发现看一篇博文不能够太长,只要能够描述清楚自己想表达的东西,能够让大家知道你要讲什么就行了.因为我今天看了一些长篇博文,真的觉得知识点太多了, 会让人囫囵吞枣. 这篇博文跟我昨天发表的类 ...

  5. WHAT is CPU负载?

    WHAT?? 1.CPU负载都有哪些? cpu负载的定义:在一般情况下可以将单核心cpu的负载看成是一条单行的桥,数字1代表cpu刚好能够处理过来,即桥上能够顺利通过所有的车辆,桥外没有等待的车辆,桥 ...

  6. 我的笔记文档版本控制系统-MediaWiki-目录悬浮+隐藏

    13年11份把北京的工作辞了,出去从北到南找同学玩了二十多天,因为各种原因,回家(宁夏)找工作,想找一个Linux相关的工作,但涉及Linux的都是运维.支持一类,最后因为各种原因找了个做java的本 ...

  7. [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  8. jmeter - 录制app接口

    准备: 1.手机 2.wifi 3.Jmeter   步骤: 1.Jmeter->文件->Template    2.手机设置代理 端口:8888:电脑的ip,如下图设置 3.点击启动   ...

  9. P3379 【模板】最近公共祖先(LCA)(倍增)

    这题有毒!!!!!!!!!! TM我重新打的板子,然而...... 5分钟打完 debug两小时 我的写法常数太大了 每次DFS都要For去更新F 最后写了快读才A 改: 只处理f[i][0] dfs ...

  10. [SCOI2007]修车 费用流 BZOJ 1070

    题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...