123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Text;
- using System.Threading.Tasks;
- namespace Ropin.Inspection.Repository
- {
- public static class ExpressionExtensions
- {
- /// <summary>
- /// 添加And条件
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="first"></param>
- /// <param name="second"></param>
- /// <returns></returns>
- 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);
- }
- /// <summary>
- /// 添加Or条件
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="first"></param>
- /// <param name="second"></param>
- /// <returns></returns>
- 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);
- }
- /// <summary>
- /// 合并表达式以及参数
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="expr1"></param>
- /// <param name="expr2"></param>
- /// <param name="func"></param>
- /// <returns></returns>
- 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 leftVisitor = new ReplaceExpressionVisitor(expr1.Parameters[0], parameter);
- var left = leftVisitor.Visit(expr1.Body);
- var rightVisitor = new ReplaceExpressionVisitor(expr2.Parameters[0], parameter);
- var right = rightVisitor.Visit(expr2.Body);
- return Expression.Lambda<Func<T, bool>>(
- 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);
- }
- }
- }
- // Expression<Func<IdentityUser, bool>> filter = u => true;
- // if (!string.IsNullOrEmpty(username))
- // {
- // filter = filter.And(c => c.UserName.Contains(username));
- // }
- //if (!string.IsNullOrEmpty(phone))
- //{
- // filter = filter.And(c => c.PhoneNumber.Contains(phone));
- //}
- //if (!string.IsNullOrEmpty(email))
- //{
- // filter = filter.And(c => c.Email.Contains(email));
- //}
- }
|