public async Task <Operation <IPage <TObject> > > GetAsync(string query = null, SortOptions sort = null, PageOptions page = null, FieldOptions fields = null, FilterOptions filter = null, ProjectionOptions projection = null) { _db.SetTypeInfo(typeof(TObject)); if (sort == null || sort == SortOptions.Empty) { sort = SortOptions.FromType <TObject>(x => x.Id); } if (page == null || page == PageOptions.Empty) { page = new PageOptions { Page = 1, PerPage = _options.CurrentValue.PerPageDefault } } ; var sql = _dialect.Build <TObject>(sort, fields, filter, projection); var data = (await _db.Current.QueryAsync <TObject>(PageBuilder.Page(_dialect, sql), new { page.Page, page.PerPage })).AsList(); var total = await _db.Current.ExecuteScalarAsync <long>(_dialect.Count(_descriptor, filter?.Fields)); var slice = new Page <TObject>(data, data.Count, page.Page - 1, page.PerPage, total); return(new Operation <IPage <TObject> >(slice)); }
public static async Task <Operation <ulong> > CountAsync(this AccessorMembers members, ISqlDialect dialect, string connectionString, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); var sql = dialect.Count(members); var count = await dialect.QuerySingleAsync <ulong>(connectionString, sql, cancellationToken : cancellationToken); return(new Operation <ulong> { Data = count }); }
public virtual async Task <Operation <IPage <Person> > > GetAsync(string query = null, SortOptions sort = null, PageOptions page = null, FieldOptions fields = null, FilterOptions filter = null, ProjectionOptions projection = null) { _db.SetTypeInfo(typeof(Person)); if (sort == SortOptions.Empty) { sort = DefaultSort; } // SELECT * FROM X WHERE Y ORDER BY Z... var sql = _dialect.Build <Person>(sort, fields, filter, projection); // FETCH OFFSET... var data = await _db.Current.QueryAsync <Person>(PageBuilder.Page(_dialect, sql), new { page.Page, page.PerPage }); // SELECT COUNT(1) WHERE ... var total = await _db.Current.ExecuteScalarAsync <long>(_dialect.Count <Person>(_descriptor, filter)); var slice = new Page <Person>(data, data.Count(), page.Page - 1, page.PerPage, total); return(new Operation <IPage <Person> >(slice)); }