Ejemplo n.º 1
0
        protected ICollection <TModel> Find <TModel>(MultiOptions <T> options) where TModel : class, new()
        {
            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            ICollection <TModel> result = null;

            if (options.UseCache)
            {
                result = Cache.Get <ICollection <TModel> >(GetScopedCacheKey(options.CacheKey));
            }

            if (result != null)
            {
                return(result);
            }

            var query = options.ApplyFilter(Collection.AsQueryable());

            if (options.UsePaging)
            {
                query = query.Skip(options.GetSkip());
            }
            if (options.UseLimit)
            {
                query = query.Take(options.GetLimit() + 1);
            }
            //if (options.Fields.Count > 0)
            //    cursor.SetFields(Fields.Include(options.Fields.ToArray()));
            //if (options.SortBy != null)
            //    query = query.OrderBy(options.SortBy);

            if (Mapper.FindTypeMapFor <T, TModel>() == null)
            {
                Mapper.CreateMap <T, TModel>();
            }

            result = new Collection <TModel>();
            foreach (var doc in query.ToList())
            {
                result.Add(Mapper.Map <T, TModel>(doc));
            }

            if (options.UseLimit)
            {
                if (result.Count > options.GetLimit())
                {
                    options.HasMore = true;
                }
                result = result.Take(options.GetLimit()).ToList();
            }

            if (options.UseCache)
            {
                Cache.Set(GetScopedCacheKey(options.CacheKey), result, options.GetCacheExpirationDate());
            }

            return(result);
        }