Ejemplo n.º 1
0
 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);
            }
Ejemplo n.º 4
0
        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);
        }