天天看點

linq to sql的多條件動态查詢(下)

借助老外寫的一個擴充表達式的類,可以把上篇中的代碼寫得更優雅

這是PredicateBuilder的源檔案

linq to sql的多條件動态查詢(下)

 public static class PredicateBuilder

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

    ...{

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

      public static Expression<Func<T, bool>> True<T> ()  ...{ return f => true;  }

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

      public static Expression<Func<T, bool>> False<T> () ...{ return f => false; }

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

      public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,

linq to sql的多條件動态查詢(下)

                                                          Expression<Func<T, bool>> expr2)

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

      ...{

linq to sql的多條件動态查詢(下)

        var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());

linq to sql的多條件動态查詢(下)

        return Expression.Lambda<Func<T, bool>>

linq to sql的多條件動态查詢(下)

              (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);

linq to sql的多條件動态查詢(下)

      }

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

      public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,

linq to sql的多條件動态查詢(下)

                                                           Expression<Func<T, bool>> expr2)

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

              (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

    }

下面是使用示例 :

linq to sql的多條件動态查詢(下)

List<Product> GetProductsByAND(params string[] keywords) 

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        DBDataContext db = new DBDataContext(Database.ConnectionString);

linq to sql的多條件動态查詢(下)

        IQueryable<Product> query = db.Products;

linq to sql的多條件動态查詢(下)

        foreach (string keyword in keywords)

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        ...{

linq to sql的多條件動态查詢(下)

            string temp = keyword;

linq to sql的多條件動态查詢(下)

            query = query.Where(p => p.Description.Contains(temp));

linq to sql的多條件動态查詢(下)

        }

linq to sql的多條件動态查詢(下)

        //翻譯後的sql語句:

linq to sql的多條件動态查詢(下)

        //Select [t0].[ID], [t0].[Name], [t0].[Description]

linq to sql的多條件動态查詢(下)

        //FROM [dbo].[Product] AS [t0]

linq to sql的多條件動态查詢(下)

        //Where ([t0].[Description] LIKE '%手機%') AND ([t0].[Description] LIKE '%6111%')

linq to sql的多條件動态查詢(下)

        return query.ToList();   

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

    List<Product> GetProductsByOR(params string[] keywords)

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

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

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

            predicate = predicate.Or(p => p.Description.Contains(temp));

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        var query = db.Products.Where(predicate);

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        //Where ([t0].[Description] LIKE '%6111%') OR ([t0].[Description] LIKE '%2350%')

linq to sql的多條件動态查詢(下)

        return query.ToList();

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

    void ShowData() 

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        //var _products = GetProductsByOR("6111", "2350");

linq to sql的多條件動态查詢(下)

        //Repeater1.DataSource = _products;

linq to sql的多條件動态查詢(下)

        //Repeater1.DataBind();

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

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

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        string _name = "6111";

linq to sql的多條件動态查詢(下)

        if (!string.IsNullOrEmpty(_name)) 

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

            predicate = predicate.And(p => p.Name.Contains(_name));

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        string _description = "長虹";

linq to sql的多條件動态查詢(下)

        if (!string.IsNullOrEmpty(_description)) 

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

            predicate = predicate.And(p => p.Description.Contains(_description));

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

        using (DBDataContext db = new DBDataContext(Database.ConnectionString))

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)

            var _Products = db.Products.Where(predicate);

linq to sql的多條件動态查詢(下)

            Repeater1.DataSource = _Products;

linq to sql的多條件動态查詢(下)

            Repeater1.DataBind();

linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)
linq to sql的多條件動态查詢(下)