zoukankan      html  css  js  c++  java
  • 改进的ExpressionItem扩展

    using System;
    using System.Linq.Expressions;

    namespace Phoenix.Modules.Common.Infrastructure.TypeExtensions.LinqExtension
    {
        public static class ExpressionExtention
        {
            public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> left, ExpressionItem<T> expressionItem)
            {
                //如果左边表达式为空
                if (left == null)
                {
                    left = (g => true);
                    return left.And(expressionItem);
                }
                //如果右表达式为空,返回左表达式
                if (expressionItem == null)
                {
                    return left;
                }

                //右边表达式变量值为空
                if (expressionItem.Value == null)
                {
                    //如果变量为空值不产生表达式
                    if (!expressionItem.AttachWhenValueNull) return left;

                    left = left.And(Specification<T>.Eval(expressionItem.Expression).GetExpression());
                    return left;

                }

                //如果右边表达式变量值不为空

                Type t = expressionItem.Value.GetType();
                //如果是字符型
                if (t.Name == "String")
                {
                    //如果是空白字符
                    if (string.IsNullOrWhiteSpace(expressionItem.Value))
                    {
                        //如果变量为空值不产生表达式
                        if (!expressionItem.AttachWhenValueNull) return left;
                    }

                }
                left = left.And(Specification<T>.Eval(expressionItem.Expression).GetExpression());
                return left;

            }

            public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> left, ExpressionItem<T> expressionItem)
            {
                //如果左边表达式为空
                if (left == null)
                {
                    left = (g => false);
                    return left.Or(expressionItem);
                }
                //如果右表达式为空,返回左表达式
                if (expressionItem == null)
                {
                    return left;
                }

                //右边表达式变量值为空
                if (expressionItem.Value == null)
                {
                    //如果变量为空值不产生表达式
                    if (!expressionItem.AttachWhenValueNull) return left;

                    left = left.Or(Specification<T>.Eval(expressionItem.Expression).GetExpression());
                    return left;

                }

                //如果右边表达式变量值不为空

                Type t = expressionItem.Value.GetType();
                //如果是字符型
                if (t.Name == "String")
                {
                    //如果是空白字符
                    if (string.IsNullOrWhiteSpace(expressionItem.Value))
                    {
                        //如果变量为空值不产生表达式
                        if (!expressionItem.AttachWhenValueNull) return left;
                    }

                }
                left = left.Or(Specification<T>.Eval(expressionItem.Expression).GetExpression());
                return left;

            }
        }

        public class ExpressionItem<T>
        {
            public ExpressionItem(Expression<Func<T, bool>> expression, dynamic value, bool attachWhenValueNull)
            {
                Expression = expression;
                Value = value;
                AttachWhenValueNull = attachWhenValueNull;
            }
            public Expression<Func<T, bool>> Expression { get; }
            public dynamic Value { get; }
            public bool AttachWhenValueNull { get; }
        }
    }

  • 相关阅读:
    java Io 流类详解
    java 集合hashmap hashset arraylist 详解以及常见面试题
    java 基本类型以及笔试常考点
    Java 面向对象思想简介(入门篇)
    SpringMVC开发过程中的中文乱码问题
    菜鸟级springmvc+spring+mybatis整合开发用户登录功能(下)
    菜鸟级springmvc+spring+mybatis整合开发用户登录功能(上)
    Applet再学习
    Applet初次使用
    ZLYD团队第5周项目总结
  • 原文地址:https://www.cnblogs.com/nirvanan/p/11981078.html
Copyright © 2011-2022 走看看