/// <summary> /// log sort field /// </summary> /// <param name="sortField"></param> /// <param name="key"></param> /// <param name="prefixLogBuilder"></param> /// <param name="suffixLogBuilder"></param> /// <param name="currentSort"></param> /// <param name="exp"></param> private void LogSortField(string sortField, string key, StringBuilder prefixLogBuilder, StringBuilder suffixLogBuilder, RSqlSort <T> currentSort, ExpressionValue exp) { if (!_logger.IsEnabled(LogLevel.Debug)) { return; } var sort = currentSort.IsDescending ? "desc" : "asc"; prefixLogBuilder?.Append($"{sortField}={key};{sort},"); var sort2 = currentSort.IsDescending ? "OrderByDescending" : "OrderBy"; suffixLogBuilder?.Append($"{sort2}({exp.Expression}) && "); }
/// <summary> /// Initializes a new instance of the <see cref="T:RSql4Net.Models.Paging.Pageable`1" /> class. /// </summary> /// <param name="pageNumber">Page number.</param> /// <param name="pageSize">Page size.</param> /// <param name="rSqlSort">Sort.</param> public RSqlPageable(int pageNumber, int pageSize, RSqlSort <T> rSqlSort = null) { _pageNumber = pageNumber; if (_pageNumber < 0) { throw new InvalidPageNumberValueException(_pageNumber); } _pageSize = pageSize; if (_pageSize <= 0) { throw new InvalidPageSizeValueException(_pageSize); } _rSqlSort = rSqlSort ; }
/// <summary> /// Gets the sort. /// </summary> /// <returns>The sort.</returns> /// <param name="queryCollection">Query collection.</param> public RSqlSort <T> GetSort(IQueryCollection queryCollection) { var sortField = _options.Value.JsonSerializerOptions.PropertyNamingPolicy.ConvertName(_settings.SortField); if (queryCollection.TryGetValue(sortField, out var sortStringValues)) { StringBuilder prefixLogBuilder = null; StringBuilder suffixLogBuilder = null; if (_logger.IsEnabled(LogLevel.Debug)) { prefixLogBuilder = new StringBuilder(); suffixLogBuilder = new StringBuilder(); } var parameter = Expression.Parameter(typeof(T)); RSqlSort <T> currentSort = null; foreach (var(key, isDescending) in ExtractSortFromQueryCollection(sortStringValues)) { if (!ExpressionValue.TryParse <T>(parameter, key, _options.Value.JsonSerializerOptions.PropertyNamingPolicy, out var exp)) { throw new UnknownSortException(key); } var expression = Expression.Convert(exp.Expression, typeof(object)); var orderExpression = Expression.Lambda <Func <T, object> >(expression, parameter); var newSort = new RSqlSort <T>() { Value = orderExpression, IsDescending = isDescending, Previous = currentSort }; if (currentSort != null) { currentSort.Next = newSort; } currentSort = newSort; LogSortField(sortField, key, prefixLogBuilder, suffixLogBuilder, currentSort, exp); } LogSort(prefixLogBuilder, suffixLogBuilder); return(currentSort?.Root); } return(null); }