zoukankan      html  css  js  c++  java
  • asp.net core Expression<Func<T, bool>> 类添加多个条件参数

    1.直接上代码吧:注意使用的地方

     expression= expression.And(p => p.Name.Equals("123"));*少了前面的的赋值只会有最后一个条件一定注意
     static void Main(string[] args)
            {
                Expression<Func<Template, bool>> expression = null;
                 expression = p => p.AAA.Equals(123);
                //expression.And(p => p.AAA==123);
                expression= expression.And(p => p.Name.Equals("123"));
                expression = expression.Or(p=>p.Age==18);
                Console.WriteLine("Hello World!");
            }
    public class Template
        {
            public int AAA { get; set; }
            public string Name { get; set; }
    
            public int Age { get; set; }
        }
    public static class ExpressionBuilder
        {
            public static Expression<Func<T, bool>> And<T>(
                this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.AndAlso<T>(second, Expression.AndAlso);
            }
    
            public static Expression<Func<T, bool>> Or<T>(
                this Expression<Func<T, bool>> first,
                Expression<Func<T, bool>> second)
            {
                return first.AndAlso<T>(second, Expression.OrElse);
            }
    
            private static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2, Func<Expression, Expression, BinaryExpression> func)
            {
                var parameter = Expression.Parameter(typeof(T));
                //var parameter2 = Expression.Parameter(typeof(T));
                var ddd= expr1.Parameters;
                var leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
                var left = leftVisitor.Visit(expr1.Body);
    
                var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);//不是用.Parameters[0]结果是不对的
                var right = rightVisitor.Visit(expr2.Body);
    
                 return Expression.Lambda<Func<T, bool>>(func(left, right), parameter);
                 ///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);
                }
            }
    
        }
  • 相关阅读:
    C# 程序一个cmd命令窗口执行多条dos命令
    单例模式学习
    C#中的typeof()和GetType()的区别
    C#判断字符串A是否包含字符串B--by winter
    ASP.NET内置对象Session缺点及解决办法---by winter
    冒泡排序--by winter
    as关键字---?号用法---各种路径
    自创page类中获取当前用户权限 --by winter
    自建的Page类的使用--by winter
    无法添加App_Code文件的解决办法
  • 原文地址:https://www.cnblogs.com/rengke2002/p/13047385.html
Copyright © 2011-2022 走看看