Linq 进行多条件查询的时候使用PredicateBuilder帮助类可以很好的解决。

类的源码:

  1. public static class PredicateBuilder
  2. {
  3.  
  4. /// <summary>
  5. /// 应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混合使用时写在AND后的OR有效
  6. /// </summary>
  7. /// <typeparam name="T"></typeparam>
  8. /// <returns></returns>
  9. public static Expression<Func<T, bool>> True<T>() { return f => true; }
  10.  
  11. /// <summary>
  12. /// 应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混合使用时写在OR后面的AND有效
  13. /// </summary>
  14. /// <typeparam name="T"></typeparam>
  15. /// <returns></returns>
  16. public static Expression<Func<T, bool>> False<T>() { return f => false; }
  17.  
  18. public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
  19. Expression<Func<T, bool>> expr2)
  20. {
  21. var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
  22. return Expression.Lambda<Func<T, bool>>
  23. (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
  24. }
  25.  
  26. public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
  27. Expression<Func<T, bool>> expr2)
  28. {
  29. var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
  30. return Expression.Lambda<Func<T, bool>>
  31. (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
  32. }
  33. }
  1. 测试方法: private void testList_True()
  2. {
  3. List<Person> listPerson = new List<Person>()
  4. {
  5. ,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
  6. ,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
  7. ,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
  8. };
  9. var where = PredicateBuilder.True<Person>();
  10. //var where= PredicateBuilder_Object.True<Person>();
  11.  
  12. //string strUserName = "chm1";
  13. //where = where.And(p => p.Name.Contains(strUserName));
  14.  
  15. ));
  16.  
  17. string strUserName = "chm1";
  18. where = where.And(p => p.Name.Contains(strUserName));
  19. ));
  20. var reulst = listPerson.AsQueryable().Where(where).ToList();
  21. }
  22. private void testList_False()
  23. {
  24. List<Person> listPerson = new List<Person>()
  25. {
  26. ,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
  27. ,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
  28. ,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
  29. };
  30. var where = PredicateBuilder.False<Person>();
  31.  
  32. string strUserName = "chm1";
  33. where = where.And(p => p.Name.Contains(strUserName));
  34.  
  35. ));
  36. string strUserName2 = "chm3";
  37. where = where.And(p => p.Name.Contains(strUserName2));
  38.  
  39. var reulst = listPerson.AsQueryable().Where(where).ToList();
  40. }

测试结果:

true: and (v)   and (v)  or(v)

true: or(x)   and (v)  or(v)

============================

false: or(v)     or(v) 

false: and (x)   and (x)

false: and (x)   or(v)  and(v)

linq 多条件查询的更多相关文章

  1. Linq in条件查询

    Linq 实现sql中的not in和in条件查询   T-SQL的IN: Select ProductID, ProductName, CategoryID From dbo.Products Wh ...

  2. EntityFramework linq 多条件查询,不定条件查询

    一.场景描述: 开发的时候,有些查询功能,往往查询的条件是不确定的,用户没有填的不参与到查询中去. 如图1所示,用户可能只要给根据名称来查询即可,有时候开始时间和结束时间并不需要填写. 图 1 二.解 ...

  3. [C#] Linq 动态条件查询

    应用背景:以货品为例,在基础数据中配置货品的判断规则,要根据这个规则筛选出符合条件的集合. 创建货品类 public class Product { public string Name { get; ...

  4. linq 多条件查询 where 拼接+分页

    首先定义一个静态类 public static class QueryAssembly { /// <summary> /// 返回true /// </summary> // ...

  5. Linq 联合条件查询快捷方法

    原方法: public ProductDC[] GetProductQueryCondition(ProductQueryConditionDC filter){//红色为原来的联合条件(之后下面的修 ...

  6. 转 --简单解决Linq多条件组合问题

    本文笔者用清晰的实例,解决了Linq多条件问题,思路十分的清晰,笔者也很细心的做了描述,希望能给你带来帮助. 最近有个项目准备功能改版,师兄吩咐:尽可能地做到万般皆Linq,所以很多东西都要从存储过程 ...

  7. Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)

    为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...

  8. Webform中linq to sql多条件查询(小练习)

    多条件查询:逐条判断,从第一个条件开始判断,如果满足,取出放入集合,再从集合中查询第二个条件... aspx代码: <body> <form id="form1" ...

  9. Linq实现字符串拼接多条件查询

    Linq实现字符串拼接多条件查询 开发过程中,为提升用户体验,经常会使用到多条件查询,本篇博客介绍如何使用Linq实现字符串拼接多条件查询 一般SQL字符串拼接 1 string sql = &quo ...

随机推荐

  1. Android学习笔记(四)

    一个应用程序是有很多活动构成的,使用Intent在活动间移动. Intent分为显式和隐式两种: 1.显示Intent: 新建一个布局文件,命名为second_layout.xml,代码如下 < ...

  2. bootstrap-导航条

    <body style="padding-top:50px"> <!-- navbar 导航条的基础样式 nav navbar-nav 导航条里菜单的固定样式组合 ...

  3. .net 使用ffmpeg.exe进行音频转码

    #region 音频转换 private int AudioIntervalTime = 100, iAudio = 0; private string strPath = "D:\\web ...

  4. 关于oracle中to_char和to_date的用法

      一.24小时的形式显示出来要用HH24 select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; select to_date('200 ...

  5. 关于页面 reflow 和 repaint

    什么是 reflow 和 repaint 浏览器为了重新渲染部分或整个页面,重新计算页面元素位置和几何结构(geometries)的进程叫做 reflow. 当确定了元素位置.大小以及其他属性,例如颜 ...

  6. git 放弃本地修改 强制更新

    git reset --hard origin/master

  7. Lock锁的使用示例

    Lock锁是java5用来代替synchronized的一种面向对象的锁的方案 public class LockDemo { /** * Lock是用来替换synchronized, 优点是Lock ...

  8. SHELL脚本攻略(学习笔记)--2.5 tr

    tr主要用于映射结果集.压缩和删除字符.我个人感觉特别有用,特别是压缩连续空格(空行)为一个空格(空行),让不规则的信息变得规则. 2.5.1 tr映射 tr [options] [SET1] [SE ...

  9. 数据库中int类型存在空数据开发过程中model和dal层处理方法

    model层 public Int32? IsFullAttendance { get; set; } dal层  if (dr["IsFullAttendance"] + &qu ...

  10. mysql 更改自动增长字段值的重新设定

    今天在服务器上MYSQL库里的一个表插入数据,主键id是auto_increment自动增长类型的.发现插入的值从2247734开始,而实际上id的最大值才22722,不明原因. 删除了新增的,opt ...