/// <summary> /// 访问Lambda表达式所有运算符(从句、二元运算符) /// </summary> /// <param name="node">节点</param> /// <returns></returns> protected override Expression VisitBinary(BinaryExpression node) { // 遇到从句将两边条件合并 BooleanClause clause; if (ClauseMapping.TryGetValue(node.NodeType, out clause)) { var leftVisitor = new SimpleVisitor(); leftVisitor.Visit(node.Left); var rightVisitor = new SimpleVisitor(); rightVisitor.Visit(node.Right); _filter = new CombinedQueryFilter(leftVisitor._filter, rightVisitor._filter, clause); return(node); } // 遇到二元运算符则将运算逻辑拆分为独立条件 BinaryOperation symbol; if (OperationMapping.TryGetValue(node.NodeType, out symbol)) { var leftVisitor = new SimpleVisitor(); leftVisitor.Visit(node.Left); var rightVisitor = new SimpleVisitor(); rightVisitor.Visit(node.Right); var x = new SingleQueryFilter(); x.AddPredicate(leftVisitor._fieldName, symbol, rightVisitor._value); _filter = x; return(node); } throw new NotSupportedException($"不支将 Lambda 表达式解析为 {nameof(QueryFilter)},请确保右侧的表达式是一个符合规范的二元表达式。"); }
/// <summary> /// 将Lambda表达式转换为条件对象 /// </summary> /// <typeparam name="T">映射类型</typeparam> /// <param name="expression">Lambda表达式</param> /// <returns></returns> public static QueryFilter Where <T>(Expression <Func <T, bool> > expression) { Guard.ArgumentNotNull(expression, nameof(expression)); var visitor = new SimpleVisitor(); visitor.Visit(expression); return(visitor.Filter); }