using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace zzz.Common.Helper { public static class ExpressionExtensions { /// /// 组合两个表达式 /// /// 泛型类型 /// 表达式1 /// 表达式2 /// 组合方式 /// 新的表达式 public static Expression Compose(this Expression expression, Expression extendExpression, Func mergeWay) { var parameterExpressionSetter = expression.Parameters .Select((u, i) => new { u, Parameter = extendExpression.Parameters[i] }) .ToDictionary(d => d.Parameter, d => d.u); var extendExpressionBody = ParameterReplaceExpressionVisitor.ReplaceParameters(parameterExpressionSetter, extendExpression.Body); return Expression.Lambda(mergeWay(expression.Body, extendExpressionBody), expression.Parameters); } /// /// 与操作合并两个表达式 /// /// 泛型类型 /// 表达式1 /// 表达式2 /// 新的表达式 public static Expression> And(this Expression> expression, Expression> extendExpression) { return expression.Compose(extendExpression, Expression.AndAlso); } /// /// 与操作合并两个表达式,支持索引器 /// /// 泛型类型 /// 表达式1 /// 表达式2 /// 新的表达式 public static Expression> And(this Expression> expression, Expression> extendExpression) { return expression.Compose(extendExpression, Expression.AndAlso); } /// /// 根据条件成立再与操作合并两个表达式 /// /// 泛型类型 /// 表达式1 /// 布尔条件 /// 表达式2 /// 新的表达式 public static Expression> AndIf(this Expression> expression, bool condition, Expression> extendExpression) { return condition ? expression.Compose(extendExpression, Expression.AndAlso) : expression; } /// /// 根据条件成立再与操作合并两个表达式,支持索引器 /// /// 泛型类型 /// 表达式1 /// 布尔条件 /// 表达式2 /// 新的表达式 public static Expression> AndIf(this Expression> expression, bool condition, Expression> extendExpression) { return condition ? expression.Compose(extendExpression, Expression.AndAlso) : expression; } /// /// 或操作合并两个表达式 /// /// 泛型类型 /// 表达式1 /// 表达式2 /// 新的表达式 public static Expression> Or(this Expression> expression, Expression> extendExpression) { return expression.Compose(extendExpression, Expression.OrElse); } /// /// 或操作合并两个表达式,支持索引器 /// /// 泛型类型 /// 表达式1 /// 表达式2 /// 新的表达式 public static Expression> Or(this Expression> expression, Expression> extendExpression) { return expression.Compose(extendExpression, Expression.OrElse); } /// /// 根据条件成立再或操作合并两个表达式 /// /// 泛型类型 /// 表达式1 /// 布尔条件 /// 表达式2 /// 新的表达式 public static Expression> OrIf(this Expression> expression, bool condition, Expression> extendExpression) { return condition ? expression.Compose(extendExpression, Expression.OrElse) : expression; } /// /// 根据条件成立再或操作合并两个表达式,支持索引器 /// /// 泛型类型 /// 表达式1 /// 布尔条件 /// 表达式2 /// 新的表达式 public static Expression> OrIf(this Expression> expression, bool condition, Expression> extendExpression) { return condition ? expression.Compose(extendExpression, Expression.OrElse) : expression; } /// /// 获取Lambda表达式属性名,只限 u=>u.Property 表达式 /// /// 泛型类型 /// 表达式 /// 属性名 public static string GetExpressionPropertyName(this Expression> expression) { if (expression.Body is UnaryExpression unaryExpression) { return ((MemberExpression)unaryExpression.Operand).Member.Name; } else if (expression.Body is MemberExpression memberExpression) { return memberExpression.Member.Name; } else if (expression.Body is ParameterExpression parameterExpression) { return parameterExpression.Type.Name; } throw new InvalidCastException(nameof(expression)); } /// /// 是否是空集合 /// /// 泛型类型 /// 集合对象 /// 是否为空集合 public static bool IsNullOrEmpty(this IEnumerable sources) { return sources == null || !sources.Any(); } } }