public void SetWhere(QueryPredicate <T> queryPredicate) { if (queryPredicate == null) { return; } this.SetWhere(queryPredicate.ToString()); }
public static QueryCommand <T> SetWhere <T>(this QueryCommand <T> command, QueryPredicate <T> queryPredicate) { if (command.QueryParameters is IPredicateQueryable queryParameters && queryPredicate != null) { return(command.SetWhere(queryPredicate.ToString())); } return(command); }
public IQueryable <TElement> CreateQuery <TElement>(Expression expression) { if (typeof(TElement) != typeof(T)) { throw new ArgumentException("Only " + typeof(T).FullName + " objects are supported"); } bool isMethodCallExpression = expression is MethodCallExpression; if (!isMethodCallExpression) { return(new ClientQueryableCollection <TElement>(this as ClientQueryProvider <TElement>, expression)); } var cmd = this.Command as QueryCommand <TElement>; MethodCallExpression mc = expression as MethodCallExpression; switch (mc.Method.Name) { case "Where": if (mc.Arguments[1] is UnaryExpression where) { var t = where.Operand as Expression <Func <TElement, bool> >; var queryPredicate = new QueryPredicate <TElement>(t); if (cmd != null && cmd.QueryParameters is IPredicateQueryable queryParameters) { queryParameters.Where.Add(queryPredicate.ToString()); } } break; case "Take": if (mc.Arguments[1] is ConstantExpression limit) { if (cmd != null && cmd.QueryParameters is IPageable queryParameters) { // Set limit to lowest value // Case: query.Take(5).Take(10) should still yield only 5 items if (queryParameters.Limit == null) { queryParameters.Limit = (int)limit.Value; } else { queryParameters.Limit = Math.Min(queryParameters.Limit.Value, (int)limit.Value); } } } break; case "Skip": if (mc.Arguments[1] is ConstantExpression offset) { if (cmd != null && cmd.QueryParameters is IPageable queryParameters) { // Sum all skips together // Case: query.Skip(5).Skip(10) should result in an offset of 15 if (queryParameters.Offset == null) { queryParameters.Offset = (int)offset.Value; } else { queryParameters.Offset += (int)offset.Value; } // Case: query.Take(3).Skip(2) should yield only 1 item // Case: query.Take(2).Skip(1).Take(2) should yield 0 items // Case: query.Skip(3).Take(1).Skip(1) should yield 0 items // This case is only of relevance if at least one Take operation was done beforehand if (queryParameters.Limit != null) { queryParameters.Limit -= (int)offset.Value; queryParameters.Limit = Math.Max(0, queryParameters.Limit.Value); } } } break; case "OrderBy": case "ThenBy": case "OrderByDescending": case "ThenByDescending": if (mc.Arguments[1] is UnaryExpression sort) { if (cmd != null && cmd.QueryParameters is ISortable queryParameters) { if (mc.Method.Name.StartsWith("OrderBy", StringComparison.Ordinal)) { queryParameters.Sort.Clear(); } var direction = SortDirection.Ascending; if (mc.Method.Name.EndsWith("Descending", StringComparison.Ordinal)) { direction = SortDirection.Descending; } var render = sort.Operand.RenderSort(); queryParameters.Sort.Add(new Sort <T>(render, direction).ToString()); } } break; case "Expand": if (mc.Arguments[1] is UnaryExpression expand) { if (cmd != null && cmd.QueryParameters is IExpandable queryParameters) { queryParameters.Expand.Add(new Expansion <TElement>(expand.Operand).ToString()); } } break; default: break; } return(new ClientQueryableCollection <TElement>(this as ClientQueryProvider <TElement>, expression)); }
public static CheckByQueryCommand <T> SetWhere <T>(this CheckByQueryCommand <T> command, QueryPredicate <T> queryPredicate) where T : Resource <T>, ICheckable <T> { return(command.SetWhere(queryPredicate.ToString())); }
public IQueryable<TElement> CreateQuery<TElement>(Expression expression) { if (typeof(TElement) != typeof(T)) { throw new ArgumentException("Only " + typeof(T).FullName + " objects are supported"); } bool isMethodCallExpression = expression is MethodCallExpression; if (!isMethodCallExpression) { return new ClientQueryableCollection<TElement>(this as ClientQueryProvider<TElement>, expression); } var cmd = this.Command as QueryCommand<TElement>; MethodCallExpression mc = expression as MethodCallExpression; switch (mc.Method.Name) { case "Where": if (mc.Arguments[1] is UnaryExpression where) { var t = where.Operand as Expression<Func<TElement, bool>>; var queryPredicate = new QueryPredicate<TElement>(t); if (cmd != null && cmd.QueryParameters is IPredicateQueryable queryParameters) { queryParameters.Where.Add(queryPredicate.ToString()); } } break; case "Take": if (mc.Arguments[1] is ConstantExpression limit) { if (cmd != null && cmd.QueryParameters is IPageable queryParameters) { queryParameters.Limit = (int)limit.Value; } } break; case "Skip": if (mc.Arguments[1] is ConstantExpression offset) { if (cmd != null && cmd.QueryParameters is IPageable queryParameters) { queryParameters.Offset = (int)offset.Value; } } break; case "OrderBy": case "ThenBy": case "OrderByDescending": case "ThenByDescending": if (mc.Arguments[1] is UnaryExpression sort) { if (cmd != null && cmd.QueryParameters is ISortable queryParameters) { if (mc.Method.Name.StartsWith("OrderBy", StringComparison.Ordinal)) { queryParameters.Sort.Clear(); } var direction = SortDirection.Ascending; if (mc.Method.Name.EndsWith("Descending", StringComparison.Ordinal)) { direction = SortDirection.Descending; } var render = sort.Operand.RenderSort(); queryParameters.Sort.Add(new Sort<T>(render, direction).ToString()); } } break; case "Expand": if (mc.Arguments[1] is UnaryExpression expand) { if (cmd != null && cmd.QueryParameters is IExpandable queryParameters) { queryParameters.Expand.Add(new Expansion<TElement>(expand.Operand).ToString()); } } break; default: break; } return new ClientQueryableCollection<TElement>(this as ClientQueryProvider<TElement>, expression); }