using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Ropin.Inspection.Repository
{
public static class ExpressionExtensions
{
///
/// 添加And条件
///
///
///
///
///
public static Expression> And(
this Expression> first,
Expression> second)
{
return first.AndAlso(second, Expression.AndAlso);
}
///
/// 添加Or条件
///
///
///
///
///
public static Expression> Or(
this Expression> first,
Expression> second)
{
return first.AndAlso(second, Expression.OrElse);
}
///
/// 合并表达式以及参数
///
///
///
///
///
///
private static Expression> AndAlso(
this Expression> expr1,
Expression> expr2,
Func 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(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);
}
}
}
// Expression> filter = u => true;
// if (!string.IsNullOrEmpty(username))
// {
// filter = filter.And(c => c.UserName.Contains(username));
// }
//if (!string.IsNullOrEmpty(phone))
//{
// filter = filter.And(c => c.PhoneNumber.Contains(phone));
//}
//if (!string.IsNullOrEmpty(email))
//{
// filter = filter.And(c => c.Email.Contains(email));
//}
}