using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace Ropin.Inspection.Repository { public static class ExpressionExtensions { /// /// 添加And条件 /// /// /// /// /// public static Expression> And( this Expression> first, Expression> second) { return first.AndAlso(second, Expression.AndAlso); } /// /// 添加Or条件 /// /// /// /// /// public static Expression> Or( this Expression> first, Expression> second) { return first.AndAlso(second, Expression.OrElse); } /// /// 合并表达式以及参数 /// /// /// /// /// /// private static Expression> AndAlso( this Expression> expr1, Expression> expr2, Func func) { var parameter = Expression.Parameter(typeof(T)); var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter); var left = leftVisitor.Visit(expr1.Body); var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter); var right = rightVisitor.Visit(expr2.Body); return Expression.Lambda>( func(left, right), parameter); } private class ReplaceExpressionVisitor : ExpressionVisitor { private readonly Expression _oldValue; private readonly Expression _newValue; public ReplaceExpressionVisitor(Expression oldValue, Expression newValue) { _oldValue = oldValue; _newValue = newValue; } public override Expression Visit(Expression node) { if (node == _oldValue) return _newValue; return base.Visit(node); } } } // Expression> filter = u => true; // if (!string.IsNullOrEmpty(username)) // { // filter = filter.And(c => c.UserName.Contains(username)); // } //if (!string.IsNullOrEmpty(phone)) //{ // filter = filter.And(c => c.PhoneNumber.Contains(phone)); //} //if (!string.IsNullOrEmpty(email)) //{ // filter = filter.And(c => c.Email.Contains(email)); //} }