public ISpecification <T> Skip <T>(ISpecification <T> spec, int count)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            mongoSpec.Skip = count;
            return(mongoSpec);
        }
        public ISpecification <T> Shard <T>(ISpecification <T> spec, ShardParams shardParams)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            mongoSpec.ShardParams = shardParams;
            return(mongoSpec);
        }
        public ISpecification <T> Take <T>(ISpecification <T> spec, int count)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            mongoSpec.Take = count;
            return(mongoSpec);
        }
        public IOrderedSpecification <T> ThenBy <T, K>(IOrderedSpecification <T> spec, Expression <Func <T, K> > keySelector, QueryOrder order)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            ((IList <QueryOrderExpression>)mongoSpec.ThenByExpressions).Add(QueryOrderExpression.CreateTheneBy(keySelector, order));
            return(mongoSpec);
        }
        public IOrderedSpecification <T> OrderBy <T, K>(ISpecification <T> spec, Expression <Func <T, K> > keySelector, QueryOrder order)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;

            mongoSpec.OrderByExpression = QueryOrderExpression.CreateOrderBy(keySelector, order);
            return(mongoSpec);
        }
        public virtual int Count <T>(ISpecification <T> spec)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;
            var cq = mongoSpec.GetQuery();

            if (mongoSpec.CriteriaExpression != null)
            {
                cq = cq.Where(mongoSpec.CriteriaExpression);
            }

            return(cq.Count());
        }
        public virtual PagingResult <T> FindPaging <T>(ISpecification <T> spec)
        {
            MongoSpecification <T> mongoSpec = (MongoSpecification <T>)spec;
            int count = 0;

            if (mongoSpec.Take > 0)
            {
                var cq = mongoSpec.GetQuery();
                if (mongoSpec.CriteriaExpression != null)
                {
                    cq = cq.Where(mongoSpec.CriteriaExpression);
                }
                count = cq.Count();
            }
            PagingResult <T> result = new PagingResult <T>(count);

            result.AddRange(mongoSpec.Query.ToList());
            return(result);
        }