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

类的源码:

 public static class PredicateBuilder
    {

        /// <summary>
        /// 应用True时:单个AND有效,多个AND有效;单个OR无效,多个OR无效;混合使用时写在AND后的OR有效
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        /// <summary>
        /// 应用False时:单个AND无效,多个AND无效;单个OR有效,多个OR有效;混合使用时写在OR后面的AND有效
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }
测试方法:   private void testList_True()
        {
            List<Person> listPerson = new List<Person>()
            {
                ,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
                ,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
                ,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
            };
            var where = PredicateBuilder.True<Person>();
            //var  where= PredicateBuilder_Object.True<Person>();

            //string strUserName = "chm1";
            //where = where.And(p => p.Name.Contains(strUserName));

            ));

            string strUserName = "chm1";
            where = where.And(p => p.Name.Contains(strUserName));
            ));
            var reulst = listPerson.AsQueryable().Where(where).ToList();
        }
        private void testList_False()
        {
            List<Person> listPerson = new List<Person>()
            {
                ,Name=, Birthday=Convert.ToDateTime("1991-01-01") },
                ,Name=, Birthday=Convert.ToDateTime("1992-01-01")},
                ,Name=, Birthday=Convert.ToDateTime("1993-01-01")}
            };
            var where = PredicateBuilder.False<Person>();

            string strUserName = "chm1";
            where = where.And(p => p.Name.Contains(strUserName));

            ));
            string strUserName2 = "chm3";
            where = where.And(p => p.Name.Contains(strUserName2));

            var reulst = listPerson.AsQueryable().Where(where).ToList();
        }

测试结果:

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. vi编辑器的简单使用

    Esc   --进入扩展模式 a i o    --进入插入模式 w --保存 q --退出 wq!--强制保存退出 p  --粘贴 前面加数字表示粘贴多少行 u --复原前一个操作 Carl+r - ...

  2. [家里蹲大学数学杂志]第047期18 世纪法国数学界的3L

    1 Lagrange---78岁 约瑟夫·拉格朗日, 全名约瑟夫·路易斯·拉格朗日 (Joseph-Louis Lagrange 1735~1813) 法国数学家.物理学家. 1736年1月25日生于 ...

  3. 显示hello

    The modern user interface is constructed from visual objects of various sorts. Depending on the oper ...

  4. maven3 手动安装本地jar到仓库

    安装命令: mvn install:install-file -Dfile={Path/to/your/ojdbc.jar} -DgroupId=com.oracle -DartifactId=ojd ...

  5. android studio新项目时提示:Plugin is too old, please update to a more recent version

    今天想写一个程序来测试一下android studo代码,但是创建好项目后,提示: Error:(1, 0) Plugin is too old, please update to a more re ...

  6. apache 配置https

    1.生成密钥# openssl genrsa 1024 > server.key这是用128位rsa算法生成密钥,并保存到server.key文件 2.生成证书请求文件# openssl req ...

  7. chrome控制台查看控件有没绑定事件[转]

    chrome控制台查看btn_comment_submit控件有没绑定事件 function lookEvents (elem) {     return $.data ? $.data( elem, ...

  8. Range-Based for Loops

    for ( decl : coll ) { statement } where decl is the declaration of each element of the passed collec ...

  9. ORACLE-SELECT学习

    (一)select格式:SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名2>[,…] [W ...

  10. zk抢主

    package com.autonavi.tinfo.t1.traffic.pub.openlr.util; import java.util.Collections;import java.util ...