zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    ASP代码审计学习笔记 -2.XSS跨站脚本
    ASP代码审计学习笔记-1.SQL注入
    基于时间延迟的Python验证脚本
    如何构造一个注入点
    动易CMS漏洞收集
    【渗透测试学习平台】 web for pentester -8.XML
    【渗透测试学习平台】 web for pentester -7.文件包含
    【渗透测试学习平台】 web for pentester -6.命令执行
    【渗透测试学习平台】 web for pentester -5.代码执行
    【渗透测试学习平台】 web for pentester -4.目录遍历
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1122135.html
Copyright © 2011-2022 走看看