Пример #1
0
        private string ToSql(Expression expression, out ODataInlineCountOption inlineCount, out List <Parameter> parameters, out Type rootElementType, out LinqToODataTranslator.ResultTranslator resultTranslator)
        {
            // translate LINQ expression to OData
            var translator = new LinqToODataTranslator();

            IQueryable rootQuery;
            var        oDataExpression = translator.Translate(expression, out rootQuery, out resultTranslator);

            rootElementType = rootQuery.ElementType;

            var queryExpression = oDataExpression as ODataQueryExpression;

            Throw <InvalidOperationException> .If(oDataExpression == null, "A queryable expression must translate to a query ODataExpression");

            inlineCount = queryExpression.InlineCount;

            // get the table SQL from the root query
            var tableQuery = rootQuery as ODataSqlQuery;

            Throw <InvalidOperationException> .If(
                tableQuery == null,
                () => "Translate: expected a root query query of type " + typeof(ODataSqlQuery) + "; found " + tableQuery
                );

            Throw <InvalidOperationException> .If(tableQuery.tableSql == null, "Invalid root query");

            // translate ODataExpression to SQL
            var sql = ODataToSqlTranslator.Translate(this.syntax, tableQuery.tableSql, queryExpression, out parameters);

            return(sql);
        }
Пример #2
0
        private void VerifyQuery <TClient, TClientResult, TResult>(Func <IQueryable <TClient>, IQueryable <TClientResult> > clientQueryTransform, Func <IQueryable <A>, IQueryable <TResult> > expectedTransform, bool requireNonEmpty = true)
        {
            var comparer = GetComparer <TResult>();

            var translated = new LinqToODataTranslator().Translate(clientQueryTransform(Empty <TClient> .Array.AsQueryable()).Expression, out var rootQuery, out var resultTranslator);

            Assert.That(translated, Is.InstanceOf <ODataQueryExpression>());
            Assert.That(rootQuery, Is.InstanceOf <IQueryable <TClient> >());

            var random      = new Random(123456);
            var wasNonEmpty = false;

            for (var i = 0; i < 10; ++i)
            {
                var randomQuery = this.RandomQueryable(random);
                var transformed = expectedTransform(randomQuery);
                var expected    = transformed.ToArray();
                wasNonEmpty |= expected.Any();
                Console.WriteLine("original = " + transformed);
                Console.WriteLine("odata = " + HttpUtility.UrlDecode(translated.ToString()));
                var rawApplied = ODataQueryFilter.Apply(randomQuery, ODataQueryParser.Parse(randomQuery.ElementType, translated.ToString()), out var inlineCountQuery);
                var applied    = (IEnumerable <TResult>)resultTranslator(rawApplied, null);
                Console.WriteLine("applied = " + rawApplied);
                applied.ToArray().CollectionShouldEqual(expected, comparer: comparer, orderMatters: true);
                Console.WriteLine(new string('-', 80));
            }
            if (requireNonEmpty)
            {
                wasNonEmpty.ShouldEqual(true, "At least 1 run should produce non-empty results!");
            }
        }