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