first commit
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user