`
wyf
  • 浏览: 433351 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

linq to sql的多条件动态查询

阅读更多

void ShowData() 
    {
        using (DBDataContext db = new DBDataContext(Database.ConnectionString))
        {
            Expression<Func<T_Bargin, bool>> expr = n => GetCondition(n);
            var _query = db.T_Bargins.Where<T_Bargin>(expr.Compile()).Select(b => new { b.F_Money, b.F_Name });
            foreach (var item in _query)
            {
                Response.Write(item.F_Name + "&nbsp;" + item.F_Money.ToString() +  "<br/>");
            }
        }     
    }
//得到合同金额大于6000,或合同名称中包含"江华"字的条件
    private bool GetCondition(T_Bargin _Table)
    {       

        bool _result = false;

        decimal _MinMoney = 6000;

        if (_MinMoney > 0)
        {
            _result |= _Table.F_Money >= _MinMoney;
        }

        string _Name = "江华";

        if (!String.IsNullOrEmpty(_Name))
        {
            _result |= _Table.F_Name.Contains(_Name);
        }
        
        return _result;
    }
 借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅

这是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(keyword));
        }
        //翻译后的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();
        }

    }
 来自:http://www.cnblogs.com/fireplume/archive/2008/04/27/1172683.html
分享到:
评论

相关推荐

    浅谈Linq to sql 的多表关联与动态条件查询

    浅谈Linq to sql 的多表关联与动态条件查询 Linq to sql 是一种强大的数据查询语言,它可以帮助开发者快速、高效地访问和操作数据库数据。在本文中,我们将讨论 Linq to sql 的多表关联和动态条件查询这两个重要的...

    Linq to sql 和 Linq to Entity 高级查询

    实现linq多个查询条件连接功能(支持linq to sql 和linq to entity)。 按多个指定属性排序功能。 不同参数的lamdba表达式条件间的转换功能。

    一个简单的linq to sql例子

    然而,LINQ to SQL的功能远不止这些,它还支持更复杂的查询、事务处理、存储过程调用等。虽然LINQ to SQL在.NET框架的最新版本中已被Entity Framework所取代,但了解它的基本工作原理对于理解ORM(对象关系映射)的...

    linq基础 linq to sql

    3. 查询数据库:使用LINQ to SQL,你可以编写查询表达式来检索、过滤、排序和分组数据库记录,这些查询会被编译成T-SQL并发送到服务器执行。 4. 操作实体: LINQ to SQL支持对象状态管理,可以跟踪对象的变化,并在...

    Linq To Sql进阶系列

    - **Linq To Sql动态查询**:Linq To Sql提供了强大的动态查询能力,允许开发者使用对象来构建查询条件,从而避免了SQL字符串拼接的问题,同时也增加了代码的可读性和安全性。 #### 7. Linq To Sql进阶系列(七)...

    LINQ to SQL手册

    **LINQ to SQL** 是 .NET Framework 中的一个技术,它允许开发者使用 C# 或 VB.NET 语言的查询表达式语法来操作数据库。本手册详细介绍了使用 LINQ to SQL 进行数据查询、操作和更新的各种方法,涵盖了从基础到高级...

    LINQ_TO_SQL_高级查询介绍

    【LINQ to SQL 高级查询详解】 LINQ (Language Integrated Query) 是.NET框架中的一种技术,它允许程序员使用一种直观、类似SQL的语法在代码中处理数据。LINQ to SQL 是 LINQ 的一个实现,专门用于与关系数据库进行...

    Linq中文教程+Linq to Sql实例大全.rar

    2. **数据上下文**:在Linq to SQL中,`DataContext`类是与数据库交互的关键,它封装了与数据库相关的操作,如创建表对象、执行查询等。 3. **匿名类型**:Linq查询结果可以返回新的匿名类型对象,无需预先定义具体...

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

    动态查询是LINQ的一个关键特性,它允许我们根据条件动态地构建查询表达式。这与静态查询形成了对比,静态查询是在编译时确定的,并且可以被编译器优化。动态查询则是在运行时构建,其优点在于灵活性,但可能牺牲一些...

    LINQ to SQL技术进行增删改查!

    LINQ (Language Integrated Query) to SQL 是.NET框架中的一项技术,它允许开发人员使用C#或Visual Basic等语言的查询语法直接对SQL Server数据库进行操作,简化了数据访问层的编程。这项技术将数据库操作与代码更...

    linq to sql

    - **局限性**:虽然LINQ to SQL在简单场景下非常方便,但对于复杂查询和支持多数据库的情况,则显得力不从心。 - **替代方案**:对于更复杂的数据库操作需求,可以考虑使用Entity Framework或NHibernate等其他ORM...

    Linq TO Sql 扩展方法

    在LINQ to SQL中,动态查询可能涉及使用dynamic关键字进行操作,以实现更灵活的查询构建。 3. **LinqToSqlExtensions**:这是 LINQ to SQL 的扩展库,包含一系列扩展方法,用于扩展默认的 LINQ to SQL 功能,比如...

    LINQ to SQL语句之Join和Order By

    LINQ to SQL语句之Join和Order By部分代码 语句描述:这个例子在From子句中使用外键导航筛选在西雅图的雇员,同时列出其所在地区。这条生成SQL语句为: SELECT [t0].[FirstName], [t0].[LastName], [t2]....

    Linq To Sql进阶

    - **联接查询(JOIN)**:在Linq To Sql中可以方便地实现多表联接,支持内连接、左连接、右连接和全连接。 - **分组查询(GROUP BY)**:用于按一个或多个键对数据进行分组,并可进行聚合操作,如Sum、Average、...

    LINQ to SQL 详解

    - 虽然LINQ to SQL提供了与SQL类似的功能,但并非所有的SQL查询构造都能被翻译成LINQ表达式。在处理复杂的SQL查询时,可能需要使用`ExecuteQuery`方法来执行自定义的SQL语句。 8. **异常处理** - 在执行排序时,...

    lINq TO sql SQL

    **LINQ to SQL** 是 .NET Framework 中的一种技术,它允许开发者使用.NET语言(如C#或VB.NET)直接对SQL数据库进行查询,无需编写大量的SQL语句。这个框架是微软在.NET 3.5 SP1版本中引入的,旨在简化数据访问层的...

    linq 学习 Linq To Sql 快速入门中文教程

    总结来说,LINQ to SQL是.NET开发中强大的数据库操作工具,结合Orcas引入的Lambda表达式,使得数据查询和操作更加直观和高效。通过深入学习和实践,开发者可以更好地掌握这一技术,从而提升项目的开发质量和效率。...

    linqtosql的多条件动态查询.pdf

    【LINQ to SQL 多条件动态查询】 在.NET框架中,LINQ to SQL是一个强大的ORM(Object-Relational Mapping)工具,它允许开发人员使用C#或VB.NET的查询语法来操作SQL数据库。然而,实现多条件动态查询时,可能会遇到...

    LINQ To SQL在.NET开发中的应用.pdf

    LINQ To SQL是针对关系数据库的查询技术,它将数据库中的表映射到.NET类,从而可以在对象模型上直接执行查询。通过这种方式,开发者可以使用C#或VB.NET的语法直接操作数据库,而无需编写SQL语句。LINQ To SQL提供了...

Global site tag (gtag.js) - Google Analytics