public ISpecification <T> Skip <T>(ISpecification <T> spec, int count)
        {
            NHibernateSpecification <T> nhSpec = (NHibernateSpecification <T>)spec;

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

            nhSpec.ShardParams = shardParams;
            return(nhSpec);
        }
        public int Count(ISpecification <TEntity> spec)
        {
            NHibernateSpecification <TEntity> nhSpec = (NHibernateSpecification <TEntity>)spec;

            var cq = nhSpec.GetSession().Query <TEntity>();

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

            return(cq.Count());
        }
        public IOrderedSpecification <T> ThenBy <T, K>(IOrderedSpecification <T> spec, Expression <Func <T, K> > keySelector, QueryOrder order)
        {
            NHibernateSpecification <T> nhSpec = (NHibernateSpecification <T>)spec;

            if (order == QueryOrder.Ascending)
            {
                nhSpec.Query = ((IOrderedQueryable <T>)nhSpec.Query).ThenBy(keySelector);
            }
            else
            {
                nhSpec.Query = ((IOrderedQueryable <T>)nhSpec.Query).ThenByDescending(keySelector);
            }
            return(nhSpec);
        }
        public PagingResult <TEntity> FindPaging(ISpecification <TEntity> spec)
        {
            NHibernateSpecification <TEntity> nhSpec = (NHibernateSpecification <TEntity>)spec;

            var cq = nhSpec.GetSession().Query <TEntity>();

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

            PagingResult <TEntity> result = new PagingResult <TEntity>(cq.Count());

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