protected virtual SqlQueryAndBinds ApplyPaging(SqlQueryAndBinds source, FilterPagingDto paging) { paging ??= new FilterPagingDto { PageSize = _appSettingsConfiguration.DefaultPageSize }; source.SqlQuery += " LIMIT @Limit OFFSET @Offset "; source.Binds.Limit = paging.PageSize; source.Binds.Offset = (paging.PageNumber - 1) * paging.PageSize; return(source); }
protected SqlQueryAndBinds ApplySortField(SqlQueryAndBinds source, FilterSortDto sort) { if (sort.IsDescending) { source.SqlQuery += $@" ORDER BY {sort.ColumnName} Desc"; } else { source.SqlQuery += $@" ORDER BY {sort.ColumnName} ASC"; } return(source); }
protected virtual SqlQueryAndBinds ApplySort(SqlQueryAndBinds source, FilterSortDto sort) { sort ??= new FilterSortDto { ColumnName = nameof(BaseModel.DateCreated), IsDescending = true }; return(sort.ColumnName switch { nameof(BaseModel.DateCreated) => ApplySortField(source, sort), nameof(BaseModel.IsActive) => ApplySortField(source, sort), nameof(BaseModel.DateDelete) => ApplySortField(source, sort), _ => source });
/// <summary> /// Get filtered entities /// </summary> /// <param name="filter"></param> /// <returns></returns> public virtual async Task <IEnumerable <TModel> > GetFiltered(BaseFilterDto filter) { var result = new SqlQueryAndBinds() { SqlQuery = GetBaseSelectQuery(), Binds = new ExpandoObject() }; result = ApplyFilter(result, filter); result = ApplySort(result, filter.Sort); result = ApplyPaging(result, filter.Paging); using IDbConnection db = new NpgsqlConnection(ConnectionString); return(await db.QueryAsync <TModel>(result.SqlQuery, (object)result.Binds)); }