public IQualifiedMember RelativeTo(IQualifiedMember otherMember) { var otherQualifiedMember = (QualifiedMember)otherMember; if ((otherQualifiedMember.LeafMember == MemberChain[0]) && otherQualifiedMember.MemberChain[0].IsRoot && ((otherQualifiedMember.Depth + 1) == Depth)) { return(this); } var relativeMemberChain = MemberChain.RelativeTo(otherQualifiedMember.MemberChain); return(new QualifiedMember(relativeMemberChain, this)); }
public QualifiedMember SetContext(IQualifiedMemberContext context) { Context = context; if (IsRoot || (JoinedNames?.Any() != false)) { return(this); } var matchingNameSets = MemberChain.ProjectToArray( context, (ctx, m) => ctx.MapperContext.Naming.GetMatchingNamesFor(m, ctx)); JoinedNames = _mapperContext.Naming.GetJoinedNamesFor(matchingNameSets); return(this); }
void Init() { var info1 = _sequence1.ConvertToIndex(null, 0, ConvertFlags.All).ToList(); var info2 = _sequence2.ConvertToIndex(null, 0, ConvertFlags.All).ToList(); if (!_isObject) { return; } var unionMembers = new List <UnionMember>(); foreach (var info in info1) { if (info.MemberChain.Length == 0) { throw new InvalidOperationException(); } var mi = info.MemberChain.First(m => m.DeclaringType !.IsSameOrParentOf(_unionParameter !.Type)); var member = new Member { SequenceInfo = info, MemberExpression = Expression.MakeMemberAccess(_unionParameter, mi) }; unionMembers.Add(new UnionMember { Member = member, Info1 = info }); } foreach (var info in info2) { if (info.MemberChain.Length == 0) { throw new InvalidOperationException(); } var em = unionMembers.FirstOrDefault(m => m.Member.SequenceInfo != null && m.Info2 == null && m.Member.SequenceInfo.CompareMembers(info)); if (em == null) { em = unionMembers.FirstOrDefault(m => m.Member.SequenceInfo != null && m.Info2 == null && m.Member.SequenceInfo.CompareLastMember(info)); } if (em == null) { var member = new Member { MemberExpression = Expression.MakeMemberAccess(_unionParameter, info.MemberChain[0]) }; if (_sequence2.IsExpression(member.MemberExpression, 1, RequestFor.Object).Result) { throw new LinqException("Types in {0} are constructed incompatibly.", _methodCall.Method.Name); } unionMembers.Add(new UnionMember { Member = member, Info2 = info }); } else { em.Info2 = info; } } var aliases1 = _sequence1.SelectQuery.Select.Columns.ToLookup(c => c.Expression, c => c.Alias); var aliases2 = _sequence2.SelectQuery.Select.Columns.ToLookup(c => c.Expression, c => c.Alias); _sequence1.SelectQuery.Select.Columns.Clear(); _sequence2.SelectQuery.Select.Columns.Clear(); for (var i = 0; i < unionMembers.Count; i++) { var member = unionMembers[i]; if (member.Info1 == null) { var type = member.Info2 !.Sql.SystemType; if (type == null) { type = member.Info2 !.MemberChain.Last().GetMemberType(); } member.Info1 = new SqlInfo ( member.Info2 !.MemberChain, new SqlValue(type, null), _sequence1.SelectQuery ); member.Member.SequenceInfo = member.Info1; } if (member.Info2 == null) { var spam = unionMembers.First(m => m.Info2 != null).Info2 !.MemberChain.First(); var type = spam.GetMemberType(); member.Info2 = new SqlInfo ( member.Info1.MemberChain, new SqlValue(type, null), _sequence2.SelectQuery ); }
public Expression GetQualifiedAccess(Expression parentInstance) => MemberChain.GetQualifiedAccess(parentInstance);