private IQueryable <Material> ObterBase(MaterialSort sort, bool ascending, string descricao)
        {
            IQueryable <Material> query = dataContext.Material.AsNoTracking();

            switch (sort)
            {
            case MaterialSort.Material_Coletado:
                query = query.SortBy(a => a.Material_Coletado, ascending);
                break;


            case MaterialSort.Cod_Material:
                if (ascending)
                {
                    query = query.OrderBy(a => a.Cod_Material == null ? 0 : 1).ThenBy(a => a.Cod_Material);
                }
                else
                {
                    query = query.OrderByDescending(a => a.Cod_Material == null ? 0 : 1).ThenByDescending(a => a.Cod_Material);
                }
                break;

            case MaterialSort.Volume:
                if (ascending)
                {
                    query = query.OrderBy(a => a.Volume == null ? 0 : 1).ThenBy(a => a.Volume);
                }
                else
                {
                    query = query.OrderByDescending(a => a.Volume == null ? 0 : 1).ThenByDescending(a => a.Volume);
                }
                break;

            case MaterialSort.Observacao:
                if (ascending)
                {
                    query = query.OrderBy(a => a.Observacao == null ? 0 : 1).ThenBy(a => a.Observacao);
                }
                else
                {
                    query = query.OrderByDescending(a => a.Observacao == null ? 0 : 1).ThenByDescending(a => a.Observacao);
                }
                break;


            case MaterialSort.Descricao:
            default:
                query = query.SortBy(x => x.Descricao, ascending);
                break;
            }

            return(query.WhereIfNotNull(x => x.Descricao.ToUpper().Contains(descricao.ToString()), descricao));
        }
        public CommandResult <PaginatedQueryResult <Material> > ObterPaginado(int pagina, int quantidade, MaterialSort sort, bool ascending, string descricao)
        {
            var listaBase = ObterBase(sort, ascending, descricao);
            var total     = listaBase.Count();
            var skip      = Pagination.PagesToSkip(quantidade, total, pagina);

            var resultado = new PaginatedQueryResult <Material>()
            {
                Total = total,
                Data  = listaBase.Skip(skip).Take(quantidade).ToArray()
            };

            return(CommandResult <PaginatedQueryResult <Material> > .Valid(resultado));
        }
        public CommandResult <IReadOnlyCollection <Material> > Obter(MaterialSort sort, bool ascending, string descricao)
        {
            var resultado = ObterBase(sort, ascending, descricao).ToArray();

            return(CommandResult <IReadOnlyCollection <Material> > .Valid(resultado));
        }