/// <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()); }
/// <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); } } }