60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq.Expressions;
 | |
| 
 | |
| namespace IRaCIS.Core.Infrastructure.Extention
 | |
| {
 | |
|     /// <summary>
 | |
|     /// LINQ扩展方法
 | |
|     /// </summary>
 | |
|     public static class LinqExtension
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// 与连接
 | |
|         /// </summary>
 | |
|         /// <typeparam name="T">类型</typeparam>
 | |
|         /// <param name="left">左条件</param>
 | |
|         /// <param name="right">右条件</param>
 | |
|         /// <returns>新表达式</returns>
 | |
|         public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
 | |
|         {
 | |
|             return CombineLambdas(left, right, ExpressionType.AndAlso);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 或连接
 | |
|         /// </summary>
 | |
|         /// <typeparam name="T">类型</typeparam>
 | |
|         /// <param name="left">左条件</param>
 | |
|         /// <param name="right">右条件</param>
 | |
|         /// <returns>新表达式</returns>
 | |
|         public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
 | |
|         {
 | |
|             return CombineLambdas(left, right, ExpressionType.OrElse);
 | |
|         }
 | |
| 
 | |
|         private static Expression<Func<T, bool>> CombineLambdas<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right, ExpressionType expressionType)
 | |
|         {
 | |
|             var visitor = new SubstituteParameterVisitor
 | |
|             {
 | |
|                 Sub =
 | |
|                 {
 | |
|                     [right.Parameters[0]] = left.Parameters[0]
 | |
|                 }
 | |
|             };
 | |
| 
 | |
|             Expression body = Expression.MakeBinary(expressionType, left.Body, visitor.Visit(right.Body));
 | |
|             return Expression.Lambda<Func<T, bool>>(body, left.Parameters[0]);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     internal class SubstituteParameterVisitor : ExpressionVisitor
 | |
|     {
 | |
|         public Dictionary<Expression, Expression> Sub = new Dictionary<Expression, Expression>();
 | |
| 
 | |
|         protected override Expression VisitParameter(ParameterExpression node)
 | |
|         {
 | |
|             return Sub.TryGetValue(node, out var newValue) ? newValue : node;
 | |
|         }
 | |
|     }
 | |
| } |