73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
using System.Linq.Expressions;
 | 
						|
 | 
						|
namespace langguanApi.Extensions
 | 
						|
{
 | 
						|
    /// <summary>
 | 
						|
    /// linq extension
 | 
						|
    /// </summary>
 | 
						|
    public static class WhereIfExtension
 | 
						|
    {
 | 
						|
        public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, bool condition, Expression<Func<T, bool>> predicate)
 | 
						|
        {
 | 
						|
            return condition ? source.Where(predicate) : source;
 | 
						|
        }
 | 
						|
        public static IQueryable<T> WhereIf<T>(this IQueryable<T> source, Expression<Func<T, int, bool>> predicate, bool condition)
 | 
						|
        {
 | 
						|
            return condition ? source.Where(predicate) : source;
 | 
						|
        }
 | 
						|
        public static IEnumerable<T> WhereIf<T>(this IEnumerable<T> source, bool condition, Func<T, bool> predicate)
 | 
						|
        {
 | 
						|
            return condition ? source.Where(predicate) : source;
 | 
						|
        }
 | 
						|
        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>
 | 
						|
        /// 合并表达式以及参数
 | 
						|
        /// </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);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |