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); }
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!"); } }