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; }
        }
    }

  • 相关阅读:
    INSERT INTO插入行记录
    BULK INSERT导入数据库
    第三章 必须知道的一些基础知识[DDT书本学习 小甲鱼]【3】
    第三章 必须知道的一些基础知识[DDT书本学习 小甲鱼]【2】
    第二章 用Python设计第一个游戏[DDT书本学习 小甲鱼]
    第一章 就这么愉快地开始吧 [DDT书本学习 小甲鱼]
    Linux——添加用户操作
    Linux——常用命令
    Linux——ls
    redis基本命令
  • 原文地址:https://www.cnblogs.com/nirvanan/p/11981078.html
Copyright © 2011-2022 走看看