80 lines
2.9 KiB
C#
80 lines
2.9 KiB
C#
using System;
|
|||
|
|
using System.Linq.Expressions;
|
||
|
|
|
||
|
|
namespace JSMachine.WMS.Infrastructure.LambdaHelp
|
||
|
|
{
|
||
|
|
public static class ExpressionExtension
|
||
|
|
{
|
||
|
|
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
|
||
|
|
{
|
||
|
|
if (expr1 == null)
|
||
|
|
return expr2;
|
||
|
|
else if (expr2 == null)
|
||
|
|
return expr1;
|
||
|
|
|
||
|
|
//return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);
|
||
|
|
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
|
||
|
|
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
|
||
|
|
|
||
|
|
var left = visitor.Replace(expr1.Body);
|
||
|
|
var right = visitor.Replace(expr2.Body);
|
||
|
|
var body = Expression.And(left, right);
|
||
|
|
return Expression.Lambda<Func<T, bool>>(body, newParameter);
|
||
|
|
}
|
||
|
|
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
|
||
|
|
{
|
||
|
|
if (expr1 == null)
|
||
|
|
return expr2;
|
||
|
|
else if (expr2 == null)
|
||
|
|
return expr1;
|
||
|
|
|
||
|
|
ParameterExpression newParameter = Expression.Parameter(typeof(T), "c");
|
||
|
|
NewExpressionVisitor visitor = new NewExpressionVisitor(newParameter);
|
||
|
|
|
||
|
|
var left = visitor.Replace(expr1.Body);
|
||
|
|
var right = visitor.Replace(expr2.Body);
|
||
|
|
var body = Expression.Or(left, right);
|
||
|
|
return Expression.Lambda<Func<T, bool>>(body, newParameter);
|
||
|
|
}
|
||
|
|
|
||
|
|
//与拼接
|
||
|
|
public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
|
||
|
|
{
|
||
|
|
var p = Expression.Parameter(typeof(T), "p");
|
||
|
|
var bd = Expression.AndAlso(
|
||
|
|
Expression.Invoke(a, p),
|
||
|
|
Expression.Invoke(b, p));
|
||
|
|
var ld = Expression.Lambda<Func<T, bool>>(bd, p);
|
||
|
|
return ld;
|
||
|
|
}
|
||
|
|
|
||
|
|
//或拼接
|
||
|
|
public static Expression<Func<T, bool>> Orelse<T>(this Expression<Func<T, bool>> a, Expression<Func<T, bool>> b)
|
||
|
|
{
|
||
|
|
var p = Expression.Parameter(typeof(T), "p");
|
||
|
|
var bd = Expression.OrElse(
|
||
|
|
Expression.Invoke(a, p),
|
||
|
|
Expression.Invoke(b, p));
|
||
|
|
var ld = Expression.Lambda<Func<T, bool>>(bd, p);
|
||
|
|
return ld;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
internal class NewExpressionVisitor : ExpressionVisitor
|
||
|
|
{
|
||
|
|
public ParameterExpression _NewParameter { get; private set; }
|
||
|
|
public NewExpressionVisitor(ParameterExpression param)
|
||
|
|
{
|
||
|
|
this._NewParameter = param;
|
||
|
|
}
|
||
|
|
public Expression Replace(Expression exp)
|
||
|
|
{
|
||
|
|
return this.Visit(exp);
|
||
|
|
}
|
||
|
|
protected override Expression VisitParameter(ParameterExpression node)
|
||
|
|
{
|
||
|
|
return this._NewParameter;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|