linq to sql的多条件动态查询(下)

借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅

这是PredicateBuilder的源文件

 public static class PredicateBuilder
    ...{
      public static Expression<Func<T, bool>> True<T> ()  ...{ return f => true;  }
      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);
      }
    }

 

下面是使用示例 :

 

List<Product> GetProductsByAND(params string[] keywords) 
    ...{
        DBDataContext db = new DBDataContext(Database.ConnectionString);
        IQueryable<Product> query = db.Products;
        foreach (string keyword in keywords)
        ...{
            string temp = keyword;
            query = query.Where(p => p.Description.Contains(temp));
        }
        //翻译后的sql语句:
        //Select [t0].[ID], [t0].[Name], [t0].[Description]
        //FROM [dbo].[Product] AS [t0]
        //Where ([t0].[Description] LIKE '%手机%') AND ([t0].[Description] LIKE '%6111%')
        return query.ToList();   
    }


    List<Product> GetProductsByOR(params string[] keywords)
    ...{
        DBDataContext db = new DBDataContext(Database.ConnectionString);
        var predicate = PredicateBuilder.False<Product>();
        foreach (string keyword in keywords)
        ...{
            string temp = keyword;
            predicate = predicate.Or(p => p.Description.Contains(temp));
        }
        var query = db.Products.Where(predicate);
        //翻译后的sql语句:
        //Select [t0].[ID], [t0].[Name], [t0].[Description]
        //FROM [dbo].[Product] AS [t0]
        //Where ([t0].[Description] LIKE '%6111%') OR ([t0].[Description] LIKE '%2350%')
        return query.ToList();
    }

    void ShowData() 
    ...{
        //var _products = GetProductsByOR("6111", "2350");
        //Repeater1.DataSource = _products;
        //Repeater1.DataBind();

        var predicate = PredicateBuilder.True<Product>();

        string _name = "6111";
        if (!string.IsNullOrEmpty(_name)) 
        ...{
            predicate = predicate.And(p => p.Name.Contains(_name));
        }

        string _description = "长虹";
        if (!string.IsNullOrEmpty(_description)) 
        ...{
            predicate = predicate.And(p => p.Description.Contains(_description));
        }

        using (DBDataContext db = new DBDataContext(Database.ConnectionString))
        ...{
            var _Products = db.Products.Where(predicate);
            Repeater1.DataSource = _Products;
            Repeater1.DataBind();
        }

    }

 

时间: 2024-09-19 10:08:50

linq to sql的多条件动态查询(下)的相关文章

linq to sql的多条件动态查询(上)

linq  to sql的多条件动态查询确实是一件头痛的事情,用表达式树或反射方法要写一大堆代码,有时候想想与其这么复杂,还不如回到手动sql拼接的年代,但是技术总是向前发展的,终归还是要在linq上解决这一问题,无意在网上发现一个还算比较简单的办法,分享一下: void ShowData()     {        using (DBDataContext db = new DBDataContext(Database.ConnectionString))        {         

LINQ to SQL语句(23)之动态查询

动态查询 有这样一个场景:应用程序可能会提供一个用户界面,用 户可以使用该用户界面指定一个或多个谓词来筛选数据.这种情况在编译时不知 道查询的细节,动态查询将十分有用. 在LINQ中,Lambda表达式是许多 标准查询运算符的基础,编译器创建lambda表达式以捕获基础查询方法(例如 Where.Select.Order By.Take While 以及其他方法)中定义的计算.表达式 目录树用于针对数据源的结构化查询,这些数据源实现IQueryable<T>. 例如,LINQ to SQL 提

ASP的多条件动态查询

动态|条件 当用ASP与SQL Server数据库打交道时,查询语句是必不可少的.SQL Server数据库本身提供了丰富的查询语句,但是如何在ASP中实现对SQL Server数据库的多条件动态查询呢?笔者在用ASP开发一个基于SQL Server的网站时,较好地解决了这一问题,本文介绍其中的实现方法. 数据库的定义 在SQL Server中定义一个数据库,名称为"comm_server".在该数据库中定义一个表,表名为"operator",包含如下表所示字段 (

用非动态SQL Server SQL语句来对动态查询进行执行

此文章主要向大家讲述的是非动态SQL ServerSQL语句执行动态查询,在实际操作中我尝试在一个存储过程中,来进行传递一系列以逗号划定界限的值,来对结果集进行限制.但是无论什么时候,我在IN子句中使用变量,都会得到错误信息. 是否存在一种不执行动态SQL语句也能完成查询的方式呢? 我尝试在一个存储过程中传递一系列以逗号划定界限的值,以限制结果集.但是无论什么时候,我在IN子句中使用变量,都会得到错误信息.是否存在一种不执行动态SQL ServerSQL语句也能完成查询的方式呢? 专家解答: 这

通过非动态SQL语句在SQL Server中执行动态查询

问题: 我尝试在一个存储过程中传递一系列以逗号划定界限的值,以限制结果集.但是无论什么时候,我在 IN子句中使用变量,都会得到错误信息.是否存在一种不执行动态SQL语句也能完成查询的方式呢? 专家解答: 这里存在一种不执行动态SQL语句也能完成查询的方式,但是首先让我们来探究这个问题.我将在以下 例子中运用AdventureWorks数据库. 在你只有一个值的时候,执行将不会有什么问题. Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3'

LINQ那些事儿(5)- 动态查询

所谓动态查询,是指查询条件或查询值都是在运行时才能确定的查询.这就意味着我们不能hard-code定义查询变量(query variable),只有根据查询时传递的条件来拼凑.下面我们看看几组不同条件组合的查询. 1) 用户输入查询条件:City为"London"且ContactName包含"Thomas" 01 public IQueryable<Customer> GetCustomers(string city, string contactNam

学Linq to sql(四):查询句法

select 描述:查询顾客的公司名.地址信息 查询句法: var 构建匿名类型1 = from c in ctx.Customers select new { 公司名 = c.CompanyName, 地址 = c.Address }; 对应SQL: SELECT [t0].[CompanyName], [t0].[Address] FROM [dbo].[Customers] AS [t0] 描述:查询职员的姓名和雇用年份 查询句法: var 构建匿名类型2 = from emp in ct

linq to sql 多个DataContext连接查询?

问题描述 如何实现两个DataContext的连接查询?如vardc1=newPersonDataContext();vardc2=newChildrenDataContext();varquery=fromaindc1joinbindc2ona.id=b.pidselectb 解决方案 解决方案二:它们的连接字符串相同解决方案三:同一次查询为何要用两个连接字符串相同的DataContext?你的设计目的是什么>?解决方案四:项目经理这么弄的,目的是用多个DataContext代理不同的业务模块

LINQ to SQL异步查询

异步操作是提高Web应用程序吞吐量的重要手段,关于这方面的话题已经在前 文<正确使用异步操作>中解释过了.对于大多数互联网应用来说,性能瓶颈数 据库访问.换句话说,一个请求在数据库操作上所花的时间往往是最多的 --并且占总时间的90%以上.因此,当Web应用程序的吞吐量因为数 据库操作的阻塞而受到影响的话,我们可是尝试使用异步数据库操作来进行优化 . 如果我们使用LINQ to SQL,在默认情况下是无法实现异步查询的,所 有的操作都非常自然--异步是不自然的,因为它把连续的操作拆成 了两段.