/// <summary>
        /// Translate an expression tree into a compiled OData query.
        /// </summary>
        /// <param name="expression">The expression tree to translate</param>
        /// <param name="contractResolver">The contract resolvers to use to determine property names from members used with expressions.</param>
        /// <returns>An OData <see cref="QueryNode"/></returns>
        internal static QueryNode Compile(Expression expression, DatasyncContractResolver contractResolver)
        {
            var visitor = new FilterBuildingExpressionVisitor(contractResolver);

            visitor.Visit(expression);
            return(visitor.FilterExpression.FirstOrDefault());
        }
Esempio n. 2
0
 /// <summary>
 /// Add an ordering expression to the query
 /// </summary>
 /// <param name="expression">An ordering method call expression</param>
 /// <param name="ascending">True if the ordering is ascending, false otherwise</param>
 /// <param name="prepend">True to prepend the ordering to the list</param>
 internal protected void AddOrdering(MethodCallExpression expression, bool ascending, bool prepend)
 {
     // We only allow keySelectors that are x => x.member expressions (i.e. MemberAccessNode).
     // Anything else will result in a NotSupportedException
     if (expression.IsValidLambdaExpression(out LambdaExpression lambda) && lambda !.Body is MemberExpression memberExpression)
     {
         string memberName = FilterBuildingExpressionVisitor.GetTableMemberName(memberExpression, ContractResolver);
         if (memberName != null)
         {
             var node = new OrderByNode(new MemberAccessNode(null, memberName), ascending);
             if (prepend)
             {
                 QueryDescription.Ordering.Insert(0, node);
             }
             else
             {
                 QueryDescription.Ordering.Add(node);
             }
         }
     }