private Expression VisitMember_Navigation(MemberExpression node) { string alias = string.Empty; Type type = node.Type; if (node.IsVisitable()) { int index = 0; this.VisitNavigation(node); foreach (var kvp in Navigations) { index += 1; if (index < Navigations.Count) { continue; } alias = _aliases.GetNavigationTableAlias(kvp.Key); type = kvp.Value.Type; } } else { alias = _aliases.GetTableAlias(node); type = node.Type; } //未实现 1对多 映射 //if (type.IsGenericType) type = type.GetGenericArguments()[0]; this.VisitAllMember(type, alias); return(node); }
protected virtual void VisitNavigation(Expression node, string memberName = null) { // 表达式 => b.Client.Address.AddressName Expression f = node; Stack <KeyValuePair <string, MemberExpression> > stack = null; while (f != null && f.IsVisitable()) { if (f.NodeType != ExpressionType.MemberAccess) { break; } if (stack == null) { stack = new Stack <KeyValuePair <string, MemberExpression> >(); } MemberExpression m = f as MemberExpression; var runtime = TypeRuntimeInfoCache.GetRuntimeInfo(m.Expression.Type); ForeignKeyAttribute attribute = runtime.GetWrapperAttribute <ForeignKeyAttribute>(m.Member.Name); if (attribute == null) { break; } string key = m.GetKeyWidthoutAnonymous(); stack.Push(new KeyValuePair <string, MemberExpression>(key, m)); f = m.Expression; } if (stack != null && stack.Count > 0) { while (stack != null && stack.Count > 0) { KeyValuePair <string, MemberExpression> kvp = stack.Pop(); string key = kvp.Key; MemberExpression m = kvp.Value; var runtime = TypeRuntimeInfoCache.GetRuntimeInfo(m.Type); // 检查查询表达式是否显示指定该表关联 string alias = _aliases.GetJoinTableAlias(runtime.TableName); if (string.IsNullOrEmpty(alias)) { // 如果没有,则使用导航属性别名 alias = _aliases.GetNavigationTableAlias(key); if (!_navigations.ContainsKey(kvp.Key)) { _navigations.Add(kvp); } } if (stack.Count == 0 && !string.IsNullOrEmpty(memberName)) { _builder.AppendMember(alias, memberName); } } } else { // => SelectMany 也会产生类似 'b.Client.Address.AddressName' 这样的表达式 string alias = _aliases.GetTableAlias(node); _builder.AppendMember(alias, memberName); } //return f; }