public Paginacao <UsuarioPerfilUnidade> Buscar(UsuarioPerfilUnidadeFiltro filtro)
 {
     return(_usuarioPerfilUnidadeRepository.Buscar(filtro));
 }
        public Paginacao <UsuarioPerfilUnidade> Buscar(UsuarioPerfilUnidadeFiltro filtro)
        {
            var retorno = new Paginacao <UsuarioPerfilUnidade>();
            var query   = DbSet.AsQueryable();

            if (filtro.IncludeUsuario)
            {
                query.Include("Usuario");
            }

            if (filtro.IncludePerfil)
            {
                query.Include("Perfil");
            }

            if (filtro.IncludeUnidade)
            {
                query.Include("Unidade");
            }

            if (filtro.IdUsuarioPerfilUnidade.HasValue)
            {
                query = query.Where(x => x.Id == filtro.IdUsuarioPerfilUnidade);
            }

            if (filtro.IdUsuario.HasValue)
            {
                query = query.Where(x => x.IdUsuario == filtro.IdUsuario);
            }

            if (filtro.SomenteNaoExcluidos)
            {
                query = query.Where(x => !x.Excluido);
            }

            retorno.QtRegistros = query.Count();

            if (filtro.Skip.HasValue && filtro.Take.HasValue)
            {
                var primeiraPagina = filtro.Skip.Value == 0;

                if (primeiraPagina)
                {
                    var perfilSolicitante = query.FirstOrDefault(x => x.IdPerfil == (int)Domain.Enums.Perfil.Solicitante);
                    if (perfilSolicitante != null)
                    {
                        retorno.Lista.Add(perfilSolicitante);
                    }
                }

                query = query.Where(x => x.IdPerfil != (int)Domain.Enums.Perfil.Solicitante);
                retorno.Lista.AddRange(filtro.OrdenarDescendente
                    ? query.OrderByDescending(filtro.OrdenarPor).Skip(!primeiraPagina ? filtro.Skip.Value - 1 : filtro.Skip.Value).Take(primeiraPagina ? filtro.Take.Value - 1 : filtro.Take.Value).ToList()
                    : query.OrderBy(filtro.OrdenarPor).Skip(!primeiraPagina ? filtro.Skip.Value - 1 : filtro.Skip.Value).Take(primeiraPagina ? filtro.Take.Value - 1 : filtro.Take.Value).ToList());
            }
            else
            {
                retorno.Lista = query.ToList();
            }

            return(retorno);
        }