// 记录选中字段 private void AddSelectedColumn(MemberInfo m, Type reflectedType) { string memberName = m.Name; var srcDbExpressionType = _builder.TranslateContext.CurrentExpressionType; var srcIsOutermost = _builder.TranslateContext.CurrentIsOutermost; if (!(srcDbExpressionType == DbExpressionType.Select && srcIsOutermost == true)) { // 非外层字段,SELECT xx As name 的 name 使用数据库原生字段 memberName = TypeUtils.GetFieldName(m, reflectedType); } // 选择字段 string newName = _selectedColumns.Add(memberName); _builder.AppendAs(newName); _builder.Append(","); _builder.AppendNewLine(); }
/// <summary> /// 访问字段或者属性表达式 /// </summary> /// <param name="node">字段或者成员表达式</param> /// <returns></returns> protected override Expression VisitMember(MemberExpression node) { // 1.<>h__TransparentIdentifier3.b.Client.ClientName // 2.<>h__TransparentIdentifier3.b.Client.ClientName.Length // 3.<>h__TransparentIdentifier3.b.Client.Address.AddressName // 4.<>h__TransparentIdentifier3.b.ClientName // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.ClientName // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.Client.ClientName // <>h__TransparentIdentifier2.<>h__TransparentIdentifier3.b.Client.Address.AddressName // 5.b.ClientName if (node == null) { return(node); } // => a.ActiveDate == DateTime.Now => a.State == (byte)state if (node.CanEvaluate()) { return(this.VisitConstant(node.Evaluate())); } // => DateTime.Now if (node.Type == typeof(DateTime) && node.Expression == null) { return(this.VisitMethodCall(node, MethodCallType.MemberMember)); } // => a.Nullable.Value bool isNullable = node.Expression.Type.IsGenericType && node.Member.Name == "Value" && node.Expression.Type.GetGenericTypeDefinition() == typeof(Nullable <>); if (isNullable) { this.Visit(node.Expression); return(node); } // 记录访问成员栈 _visitedStack.Add(node); // => a.Name.Length if (TypeUtils.IsPrimitiveType(node.Expression.Type)) { return(this.VisitMethodCall(node, MethodCallType.MemberMember)); } // => <>h__3.b.ClientName if (!node.Expression.Visitable()) { _builder.AppendMember(_ag, node); return(node); } // => a.Accounts[0].Markets[0].MarketId // => b.Client.Address.AddressName Expression objExpression = node.Expression; bool isMethodCall = objExpression != null && objExpression.NodeType == ExpressionType.Call; if (isMethodCall) { MethodCallExpression methodExpression = objExpression as MethodCallExpression; bool isIndex = methodExpression.IsCollectionIndex(); if (isIndex) { objExpression = methodExpression.Object; } } // => b.Client.Address.AddressName this.VisitNavMember(objExpression, TypeUtils.GetFieldName(node.Member, node.Expression.Type)); return(node); }
/// <summary> /// 访问 Lambda 表达式,如 p=>p p=>p.t p=>p.Id /// </summary> /// <typeparam name="T">返回类型</typeparam> /// <param name="node">Lambda 表达式</param> /// <returns></returns> protected override Expression VisitLambda <T>(Expression <T> node) { LambdaExpression lambda = node as LambdaExpression; if (lambda.Body.NodeType == ExpressionType.Parameter) { // 例: a=> a Type type = lambda.Body.Type; string alias = _ag.GetTableAlias(lambda); this.VisitAllMember(type, alias); return(node); } else if (lambda.Body.CanEvaluate()) { // 例:a=>1 base.Visit(lambda.Body.Evaluate()); // 选择字段 string newName = _selectedColumns.Add(AppConst.CONSTANT_COLUMN_NAME); // 添加字段别名 _builder.AppendAs(newName); return(node); } else if (lambda.Body.NodeType == ExpressionType.MemberAccess) { // 例: t=> t.a // => SELECT a.ClientId Type type = lambda.Body.Type; if (!TypeUtils.IsPrimitiveType(type)) { return(this.VisitAllMember(type, _ag.GetTableAlias(lambda.Body), node)); } else { var newNode = this.VisitWithoutStack(_ => base.VisitLambda(node)); var memberExpression = lambda.Body as MemberExpression; string memberName = memberExpression.Member.Name; var srcDbExpressionType = _builder.TranslateContext.CurrentExpressionType; var srcIsOutermost = _builder.TranslateContext.CurrentIsOutermost; if (!(srcDbExpressionType != null && srcDbExpressionType == DbExpressionType.Select && srcIsOutermost != null && srcIsOutermost.Value)) { // 非外层字段,SELECT xx As name 的 name 使用数据库原生字段 memberName = TypeUtils.GetFieldName(memberExpression.Member, memberExpression.Expression.Type); } string newName = _selectedColumns.Add(memberName); return(newNode); } } else { // 例:a => a.DemoCode,选择字段仅选一个基元类型字段。 // 结果可能返回一个比如字符串类型列表 var newNode = base.VisitLambda(node); if (_selectedColumns.Count == 0) { // 选择字段 string newName = _selectedColumns.Add(AppConst.CONSTANT_COLUMN_NAME); // 添加字段别名 _builder.AppendAs(newName); } return(newNode); } }