定义and/or方法:
void And(ref Expression<Func<EF生成的DB实体, bool>> left, Expression<Func<EF生成的DB实体, bool>> right)
{
ParameterExpression para = Expression.Parameter(typeof(EF生成的DB实体));
var leftVisitor = new ReplaceExpressionVisitor(left.Parameters[0], para);
var leftBody = leftVisitor.Visit(left.Body);
var rightVisitor = new ReplaceExpressionVisitor(right.Parameters[0], para);
var rightBody = rightVisitor.Visit(right.Body);
//var leftBody = (BinaryExpression)left.Body;
//var rightBody = (BinaryExpression)right.Body;
var body = Expression.AndAlso(leftBody, rightBody);
left = Expression.Lambda<Func<EF生成的DB实体, bool>>(body, para);
}
void Or(ref Expression<Func<EF生成的DB实体, bool>> left, Expression<Func<EF生成的DB实体, bool>> right)
{
ParameterExpression para = Expression.Parameter(typeof(EF生成的DB实体));
var leftVisitor = new ReplaceExpressionVisitor(left.Parameters[0], para);
var leftBody = leftVisitor.Visit(left.Body);
var rightVisitor = new ReplaceExpressionVisitor(right.Parameters[0], para);
var rightBody = rightVisitor.Visit(right.Body);
//var leftBody = (BinaryExpression)left.Body;
//var rightBody = (BinaryExpression)right.Body;
var body = Expression.OrElse(leftBody, rightBody);
left = Expression.Lambda<Func<EF生成的DB实体, bool>>(body, para);
}
具体使用(Linq语句):
using(EF中DB实体类 db = new ***()){
Expression<Func<EF生成的DB实体, bool>> where = x => true;
And(ref where, x => x.db中字段1 == 用户参数1);
And(ref where, x => x.db字段2 <= 用户参数2);
......
(from p in db.DB中对应表名 select p).Where(where).ToList();
}