using Ant.Common; using Ant.Core.Visitors; using Ant.DbExpressions; using Ant.Extensions; using Ant.Utility; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace Ant.Query.Visitors { internal class GeneralExpressionVisitor : ExpressionVisitorBase { LambdaExpression _lambda; List _moeList; GeneralExpressionVisitor(List moeList) { this._moeList = moeList; } public GeneralExpressionVisitor(LambdaExpression lambda, List moeList) { this._lambda = lambda; this._moeList = moeList; } public static DbExpression VisitPredicate(LambdaExpression lambda, List moeList) { GeneralExpressionVisitor visitor = new GeneralExpressionVisitor(moeList); return visitor.Visit(lambda); } int FindParameterIndex(ParameterExpression exp) { int idx = this._lambda.Parameters.IndexOf(exp); if (idx == -1) { throw new Exception("Can not find the ParameterExpression index"); } return idx; } protected override DbExpression VisitLambda(LambdaExpression lambda) { this._lambda = lambda; return base.VisitLambda(lambda); } protected override DbExpression VisitMemberAccess(MemberExpression exp) { ParameterExpression p; if (ExpressionExtensions.IsDerivedFromParameter(exp, out p)) { int idx = this.FindParameterIndex(p); IMappingObjectExpression moe = this._moeList[idx]; return moe.GetDbExpression(exp); } else { return base.VisitMemberAccess(exp); } } protected override DbExpression VisitParameter(ParameterExpression exp) { //TODO 只支持 MappingFieldExpression 类型,即类似 q.Select(a=> a.Id).Where(a=> a > 0) 这种情况,也就是 ParameterExpression.Type 为基本映射类型。 if (AntUtils.IsMapType(exp.Type)) { int idx = this.FindParameterIndex(exp); IMappingObjectExpression moe = this._moeList[idx]; MappingFieldExpression mfe = (MappingFieldExpression)moe; return mfe.Expression; } else throw new NotSupportedException(exp.ToString()); } } }