(精华)2020年8月11日 C#基础知识点 表达式目录树扩展(And,Or,Not)

#region 表达式链接
{
     
    Expression<Func<People, bool>> lambda1 = x => x.Age > 5;
    Expression<Func<People, bool>> lambda2 = x => x.Id > 5;
    Expression<Func<People, bool>> lambda3 = lambda1.And(lambda2);
    Expression<Func<People, bool>> lambda4 = lambda1.Or(lambda2);
    Expression<Func<People, bool>> lambda5 = lambda1.Not();
    Do1(lambda3);
    Do1(lambda4);
    Do1(lambda5);
}
#endregion
#region PrivateMethod
        private static void Do1(Func<People, bool> func)
        {
     
            List<People> people = new List<People>();
            people.Where(func);
        }
        private static void Do1(Expression<Func<People, bool>> func)
        {
     
            List<People> people = new List<People>()
            {
     
                new People(){
     Id=4,Name="123",Age=4},
                new People(){
     Id=5,Name="234",Age=5},
                new People(){
     Id=6,Name="345",Age=6},
            };

            List<People> peopleList = people.Where(func.Compile()).ToList();
        }

        private static IQueryable<People> GetQueryable(Expression<Func<People, bool>> func)
        {
     
            List<People> people = new List<People>()
            {
     
                new People(){
     Id=4,Name="123",Age=4},
                new People(){
     Id=5,Name="234",Age=5},
                new People(){
     Id=6,Name="345",Age=6},
            };

            return people.AsQueryable<People>().Where(func);
        }
        #endregion
/// 
    /// 合并表达式 And Or  Not扩展
    /// 
    public static class ExpressionExtend
    {
     
        /// 
        /// 合并表达式 expr1 AND expr2
        /// 
        /// 
        /// 
        /// 
        /// 
        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
        {
     
            //return Expression.Lambda>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
            ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);

            var left = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body = Expression.And(left, right);
            return Expression.Lambda<Func<T, bool>>(body, newParameter);

        }
        /// 
        /// 合并表达式 expr1 or expr2
        /// 
        /// 
        /// 
        /// 
        /// 
        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
        {
     

            ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
            NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);

            var left = visitor.Replace(expr1.Body);
            var right = visitor.Replace(expr2.Body);
            var body = Expression.Or(left, right);
            return Expression.Lambda<Func<T, bool>>(body, newParameter);
        }
        public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> expr)
        {
     
            var candidateExpr = expr.Parameters[0];
            var body = Expression.Not(expr.Body);

            return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
        }
    }

你可能感兴趣的:(C#,c#)