public SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) { return(SubQuery .ConvertToIndex(expression, level, flags) .Select(idx => new SqlInfo { Sql = SubQuery.SqlQuery.Select.Columns[idx.Index], Member = idx.Member }) .ToArray()); }
public override SqlInfo[] ConvertToIndex(Expression expression, int level, ConvertFlags flags) { if (_innerContext != null) { return(_innerContext.ConvertToIndex(expression, level, flags)); } return(base.ConvertToIndex(expression, level, flags)); }
void CheckAndAddMember(IBuildContext sequence1, IBuildContext sequence2, SqlInfo info) { var member = new Member { SequenceInfo = info, MemberExpression = Expression.PropertyOrField(_unionParameter, info.Members[0].Name) }; if (sequence1.IsExpression(member.MemberExpression, 1, RequestFor.Object).Result) { throw new LinqException("Types in {0} are constructed incompatibly.", _methodCall.Method.Name); } var idx = sequence2.ConvertToIndex(member.MemberExpression, 1, ConvertFlags.Field); if (idx[0].Index != member.SequenceInfo.Index) { throw new LinqException("Types in {0} are constructed incompatibly.", _methodCall.Method.Name); } _members.Add(member.MemberExpression.Member, member); }
int GetIndex(SqlQuery.Column column) { int idx; if (!_indexes.TryGetValue(column, out idx)) { if (Union != null && !_checkUnion) { _checkUnion = true; var subSql = SubQuery.ConvertToIndex(null, 0, ConvertFlags.All).OrderBy(_ => _.Index).ToList(); var unionSql = Union.ConvertToIndex(null, 0, ConvertFlags.All).OrderBy(_ => _.Index).ToList(); var sub = SubQuery.SqlQuery.Select.Columns; var union = Union.SqlQuery.Select.Columns; for (var i = 0; i < sub.Count; i++) { if (i >= subSql.Count || subSql[i].Index != i) { if (i < subSql.Count && subSql[i].Index < i) { throw new InvalidOperationException(); } subSql.Insert(i, new SqlInfo { Index = i, Sql = sub[i].Expression }); } } for (var i = 0; i < union.Count; i++) { if (i >= unionSql.Count || unionSql[i].Index != i) { if (i < unionSql.Count && unionSql[i].Index < i) { throw new InvalidOperationException(); } unionSql.Insert(i, new SqlInfo { Index = i, Sql = union[i].Expression }); } } var reorder = false; for (var i = 0; i < subSql.Count && i < unionSql.Count; i++) { if (subSql[i].Member != unionSql[i].Member) { reorder = true; var sm = subSql[i].Member; if (sm != null) { var um = unionSql.Select((s, n) => new { s, n }).Where(_ => _.s.Member == sm).FirstOrDefault(); if (um != null) { unionSql.RemoveAt(um.n); unionSql.Insert(i, um.s); } else { if (unionSql[i].Member != null) { unionSql.Insert(i, new SqlInfo()); } } } else { if (unionSql[i].Member != null) { unionSql.Insert(i, new SqlInfo()); } } } } if (reorder) { var cols = union.ToList(); union.Clear(); foreach (var info in unionSql) { if (info.Index < 0) { union.Add(new SqlQuery.Column(Union.SqlQuery, new SqlValue(null))); } else { union.Add(cols[info.Index]); } } } while (sub.Count < union.Count) { sub.Add(new SqlQuery.Column(SubQuery.SqlQuery, new SqlValue(null))); } while (union.Count < sub.Count) { union.Add(new SqlQuery.Column(Union.SqlQuery, new SqlValue(null))); } } idx = SqlQuery.Select.Add(column); _indexes.Add(column, idx); if (Union != null) { while (SubQuery.SqlQuery.Select.Columns.Count < Union.SqlQuery.Select.Columns.Count) { Union.SqlQuery.Select.Columns.Add(new SqlQuery.Column(Union.SqlQuery, new SqlValue(null))); } } } return(idx); }