本文共 1926 字,大约阅读时间需要 6 分钟。
1.多条件OR使用实例:
//学费if (string.IsNullOrEmpty(tuition) == false && tuition != "0"){ Expression> orQuery = q => false; foreach (var item in tuitionID) { Tuition tui = Tuition.GetMode(item); orQuery = orQuery.Or(q => q.TuitionFee >= tui.MinValue && q.TuitionFee < tui.MaxValue); } query = query.Where(orQuery);}
2.添加扩展方法
public static class Utility { public static ExpressionCompose (this Expression first, Expression second, Func merge) { // build parameter map (from parameters of second to parameters of first) var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f); // replace parameters in the second lambda expression with parameters from the first var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body); // apply composition of lambda expression bodies to parameters from the first expression return Expression.Lambda (merge(first.Body, secondBody), first.Parameters); } public static Expression > And (this Expression > first, Expression > second) { return first.Compose(second, Expression.And); } public static Expression > Or (this Expression > first, Expression > second) { return first.Compose(second, Expression.Or); } } public class ParameterRebinder : ExpressionVisitor { private readonly Dictionary map; public ParameterRebinder(Dictionary map) { this.map = map ?? new Dictionary (); } public static Expression ReplaceParameters(Dictionary map, Expression exp) { return new ParameterRebinder(map).Visit(exp); } protected override Expression VisitParameter(ParameterExpression p) { ParameterExpression replacement; if (map.TryGetValue(p, out replacement)) { p = replacement; } return base.VisitParameter(p); } }
更多参考:
转载地址:http://duogi.baihongyu.com/