예제 #1
0
            public override FieldIndex[] Select <T>(ExpressionParserOld <T> parser)
            {
                ParsingTracer.WriteLine(this);
                ParsingTracer.WriteLine(QuerySource);
                ParsingTracer.IncIndentLevel();

                if (_index == null)
                {
                    SetSubIndex(parser);

                    _index = new FieldIndex[_subIndex.Length];

                    for (var i = 0; i < _subIndex.Length; i++)
                    {
                        var col = QuerySource.SubSql.Select.Columns[_subIndex[i].Index];
                        _index[i] = new FieldIndex {
                            Index = QuerySource.SqlQuery.Select.Add(col), Field = this
                        };
                    }
                }

                ParsingTracer.DecIndentLevel();
                ParsingTracer.WriteLine(QuerySource);
                return(_index);
            }
예제 #2
0
            public override ISqlExpression[] GetExpressions <T>(ExpressionParserOld <T> parser)
            {
                SetSubIndex(parser);

                if (_subIndex.Length != 1)
                {
                    throw new LinqException("Cannot convert '{0}' to SQL.", Field.GetExpressions(parser)[0]);
                }

                return(new [] { QuerySource.SubSql.Select.Columns[_subIndex[0].Index] });
            }
예제 #3
0
            void SetSubIndex <T>(ExpressionParserOld <T> parser)
            {
                if (_subIndex == null)
                {
                    _subIndex = Field.Select(parser);

                    for (var i = 0; i < _subIndex.Length; i++)
                    {
                        var idx = _subIndex[i];

                        var f = QuerySource.BaseQuery.GetField(idx.Field);

                        if (f != null && f != idx.Field)
                        {
                            var idxs = f.Select(parser);

                            if (idxs.Length == 1)
                            {
                                _subIndex[i] = idxs[0];
                            }
                        }
                    }

                    if (QuerySource.SubSql.HasUnion)
                    {
                        var sub = QuerySource.BaseQuery;
                        var idx = sub.Fields.IndexOf(Field);
                        var mi  = sub.GetMember(Field);

                        foreach (var union in QuerySource.Unions)
                        {
                            if (mi != null)
                            {
                                var f = union.GetField(mi, _ => _ is QuerySource);

                                if (f != null)
                                {
                                    f.Select(parser);
                                    continue;
                                }

                                if (union is QuerySource.Expr)
                                {
                                    union.SqlQuery.Select.Add(new SqlValue(null));
                                    continue;
                                }
                            }

                            union.Fields[idx].Select(parser);
                        }
                    }
                }
            }
예제 #4
0
            public override FieldIndex[] Select <T>(ExpressionParserOld <T> _)
            {
                ParsingTracer.WriteLine(this);
                ParsingTracer.WriteLine("table", Table);
                ParsingTracer.IncIndentLevel();

                var index = new[] { new FieldIndex {
                                        Index = Table.SqlQuery.Select.Add(Field, Field.Alias), Field = this
                                    } };

                ParsingTracer.DecIndentLevel();
                ParsingTracer.WriteLine("table", Table);
                return(index);
            }
예제 #5
0
            //ISqlExpression  _sqlExpression;

            public override FieldIndex[] Select <T>(ExpressionParserOld <T> parser)
            {
                if (_index == null)
                {
                    var idx = _queryField.Select(parser);

                    var expr = idx[0].Field.GetExpressions(parser);

                    _index = new[] { new FieldIndex {
                                         Index = _querySource.SqlQuery.Select.Add(expr[0]), Field = this
                                     } };
                }

                return(_index);
            }
예제 #6
0
            public override FieldIndex[] Select <T>(ExpressionParserOld <T> parser)
            {
                ParsingTracer.WriteLine(this);
                ParsingTracer.WriteLine(GroupBySource.BaseQuery);
                ParsingTracer.IncIndentLevel();

                if (_index == null)
                {
                    _index = GroupBySource.BaseQuery.Select(parser);
                }

                ParsingTracer.DecIndentLevel();
                ParsingTracer.WriteLine(GroupBySource.BaseQuery);
                return(_index);
            }
예제 #7
0
            public override ISqlExpression[] GetExpressions <T>(ExpressionParserOld <T> parser)
            {
                if (_sqlExpression == null)
                {
                    if (_inParsing)
                    {
                        return(null);
                    }

                    _inParsing     = true;
                    _sqlExpression = Parse(parser, QuerySource.Sources);
                    _inParsing     = false;
                }

                return(new [] { _sqlExpression });
            }
예제 #8
0
            ISqlExpression Parse <T>(ExpressionParserOld <T> parser, params QuerySource[] sources)
            {
                var expr = parser.ParseExpression(Expr, sources);

                if (expr is SqlQuery.SearchCondition)
                {
                    /*
                     * expr = parser.Convert(new SqlFunction("CASE",
                     *      expr, new SqlValue(true),
                     *      new SqlQuery.SearchCondition(new[] { new SqlQuery.Condition(true, (SqlQuery.SearchCondition)expr) }), new SqlValue(false),
                     *      new SqlValue(false)));
                     */

                    expr = parser.Convert(new SqlFunction(typeof(bool), "CASE", expr, new SqlValue(true), new SqlValue(false)));
                }

                return(expr);
            }
예제 #9
0
            public override FieldIndex[] Select <T>(ExpressionParserOld <T> parser)
            {
                ParsingTracer.WriteLine(this);
                ParsingTracer.WriteLine(QuerySource);
                ParsingTracer.IncIndentLevel();

                if (_index == null)
                {
                    if (_sqlExpression == null)
                    {
                        _sqlExpression = Parse(parser, QuerySource.Sources);
                    }

                    _index = new[] { new FieldIndex {
                                         Index = QuerySource.SqlQuery.Select.Add(_sqlExpression, _alias), Field = this
                                     } };
                }

                ParsingTracer.DecIndentLevel();
                ParsingTracer.WriteLine(QuerySource);

                return(_index);
            }
예제 #10
0
        Query <T> GetInfo(IDataContext dataContext)
        {
            var dataContextInfo = DataContextInfo.Create(dataContext);

            string        lastContextID;
            MappingSchema lastMappingSchema;
            Query <T>     query;

            lock (_sync)
            {
                lastContextID     = _lastContextID;
                lastMappingSchema = _lastMappingSchema;
                query             = _lastQuery;
            }

            var contextID     = dataContextInfo.ContextID;
            var mappingSchema = dataContextInfo.MappingSchema;

            if (lastContextID != contextID || lastMappingSchema != mappingSchema)
            {
                query = null;
            }

            if (query == null)
            {
                var key = new { contextID, mappingSchema };

                lock (_sync)
                    _infos.TryGetValue(key, out query);

                if (query == null)
                {
                    lock (_sync)
                    {
                        _infos.TryGetValue(key, out query);

                        if (query == null)
                        {
#if NEW_PARSER
                            query = new ExpressionBuilder(new Query <T>(), dataContextInfo, _expression, _lambda.Parameters.ToArray())
                                    .Build <T>();
#else
                            query = new ExpressionParserOld <T>().Parse(
                                contextID,
                                mappingSchema,
                                dataContextInfo.CreateSqlProvider,
                                _expression,
                                _lambda.Parameters.ToArray());
#endif

                            _infos.Add(key, query);

                            _lastContextID     = contextID;
                            _lastMappingSchema = mappingSchema;
                            _lastQuery         = query;
                        }
                    }
                }
            }

            return(query);
        }
예제 #11
0
 public abstract ISqlExpression[]      GetExpressions <T>(ExpressionParserOld <T> parser);
예제 #12
0
 public abstract FieldIndex[]          Select <T>(ExpressionParserOld <T> parser);
예제 #13
0
 public override ISqlExpression[] GetExpressions <T>(ExpressionParserOld <T> parser)
 {
     throw new NotImplementedException();
 }
예제 #14
0
 public override ISqlExpression[] GetExpressions <T>(ExpressionParserOld <T> parser)
 {
     return(new [] { Field });
 }
예제 #15
0
 public override ISqlExpression[] GetExpressions <T>(ExpressionParserOld <T> parser)
 {
     return(GroupBySource.BaseQuery.GetExpressions(parser));
 }