Wednesday, 2 April 2014

Add multiple condition dynamically in Linq to sql


What to do if you want to add multiple where condition dynamically in linq. Here is solution for that. This is working fine for Linq to Sql. You have to use LinqKit for Linq to Entity.



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.OrElse(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.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }

Use this predicate class in our code.

using (DataSQLDataContext db = new DataSQLDataContext())
            {
               Expression<Func<tblInfoe, bool>> predicate = PredicateBuilder.True<tblInfoe>();
    // tblInfoe = Tables from DB
                predicate = predicate.And(p => p.Name == "Ajay");
                predicate = predicate.And(p => p.City == 2);
                var d = db.tblInfoes.Where(predicate);
            }

No comments:

Post a comment