• 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();
            }


        }



    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    下面我使用vector容器为基础来构成一棵树
    COM编程
    vc买书指导
    [转帖] 职场学习=贼学技术
    创业者应具备的基本商业知识
    比尔盖茨的10大优秀员工准则(看你符合几条)
    损害个人魅力的26条错(转帖)
    流行:时尚健康美女10大标准
    人生要做的30件事(转帖)
    最伟大的管理原则
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1122135.html
Copyright © 2020-2023  润新知