public async Task <IEnumerable <T> > FetchAsync(IObjectQuery query, bool readOnly = true)
        {
            var modelQuery = query.BuildQuery <T>(Db);
            var q          = readOnly ? modelQuery.AsNoTracking() : modelQuery;

            return(await q.ToArrayAsync());
        }
        public async Task <bool> AnyAsync(IObjectQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query), "query parameter should not be null");
            }

            return(await CountAsync(query) > 0);
        }
        public async Task <SearchResults <T> > SearchAsync(IObjectQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query), "query parameter should not be null");
            }

            // TODO: use single db call for count and results

            return(new SearchResults <T>(await CountAsync(query),
                                         await FetchAsync(query)));
        }
        public async Task <int> CountAsync(IObjectQuery query)
        {
            if (query == null)
            {
                throw new ArgumentNullException(nameof(query), "query parameter should not be null");
            }

            var countQuery = BuildCountQuery(query);

            return(await countQuery
                   .AsNoTracking()
                   .CountAsync());
        }
        private IQueryable <T> BuildCountQuery(IObjectQuery query)
        {
            var numberOfItemsToReturn = query.NumberOfItemsToReturn;
            var numberOfItemToSkip    = query.NumberOfItemsToSkip;

            query.NumberOfItemsToReturn = query.NumberOfItemsToSkip = null;

            var modelQuery = query.BuildQuery <T>(Db);

            query.NumberOfItemsToReturn = numberOfItemsToReturn;
            query.NumberOfItemsToSkip   = numberOfItemToSkip;

            return(modelQuery);
        }
 public async Task <T> FindOneAsync(IObjectQuery query)
 {
     return(await query.BuildQuery <T>(Db)
            //.AsNoTracking()
            .FirstOrDefaultAsync());
 }