Inquiridor
AUTO RELACIONAMENTO EF ASPNET CORE 2

Discussão Geral
-
Olá boa noite pessoal
tenho uma tabela Categorias (CategoriaId, Nome, SubCategoriaId) sendo SubCategoriaId chave estrangeira de CategoriaId que aceita Null
Como retornar esses dados no EntityFramework alinhados? sendo nós pais primeiro e filhos na sequencia?- Tipo Alterado Filipe B CastroModerator segunda-feira, 23 de abril de 2018 21:43
Todas as Respostas
-
minha entidade
public class Categoria { [Key] [Required] public int CategoriaId { get; set; } [Required] [StringLength(30)] public string Nome { get; set; } [StringLength(50)] public string Descricao { get; set; } public int? SubCategoriaId { get; set; } [ForeignKey("SubCategoriaId")] public virtual Categoria SubCategoria { get; set; } [InverseProperty("SubCategoria")] public virtual ICollection<Categoria> SubCategorias { get; set; } }
-
Boa tarde, Michaeell. Tudo bem?
Obrigado por usar o fórum MSDN.
Essa seria uma questão de "How to/Customização" ou "Break Fix/Erro"?
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
gostaria é de consultar e exibir os registros auto relacionados
depois de muito pesquisar e tentar, encontrei algumas opcoes...
uma seria criar uma view no banco utilizando With / Union / Join
CREATE VIEW [dbo].[ViewCategorias] AS WITH Tree (CategoriaId, SubCategoriaId, Nome,NomeAll, Nivel, NivelAll, IdsAll) AS ( SELECT CategoriaId, SubCategoriaId, Categorias.Nome, convert(varchar(300), Categorias.Nome) as NomeAll, 1 as Nivel, convert(varchar, ROW_NUMBER() OVER(ORDER BY nome ASC)) as NivelAll, convert(varchar, Categorias.CategoriaId) as IdsAll FROM Categorias WHERE SubCategoriaId IS NULL UNION ALL SELECT Y.CategoriaId, Y.SubCategoriaId, Y.Nome, convert(varchar(300), Tree.NomeAll + ' » ' + Y.Nome) as NomeAll, (Tree.Nivel+1) as Nivel, convert(varchar, Tree.NivelAll +'.'+convert(varchar,ROW_NUMBER() OVER(ORDER BY Tree.nome ASC))) as NivelAll , convert(varchar, Tree.IdsAll + '.' + convert(varchar, Y.CategoriaId)) as IdsAll FROM Categorias Y INNER JOIN Tree ON Y.SubCategoriaId = Tree.CategoriaId ) SELECT CategoriaId, SubCategoriaId, Nome, (REPLICATE('»',Tree.Nivel-1) + ' ' + Tree.Nome) as NomeTree, NomeAll, IdsAll, Nivel, NivelAll FROM Tree GO
entao em meu controle faço
var categorias = _context.Categoria.FromSql("Select * From ViewCategorias").OrderBy(x => x.NivelAll);
outra opção que encontrei foi criar uma consulta dentro da outra.
private List<Categoria> GetChildren(IList<Categoria> categorias, int? parentId = null, string parentNomeAll = null, string parentIdAll = null) { return categorias.Where(l => l.SubCategoriaId == parentId).OrderBy(l => l.Nome) .Select(l => new Categoria { CategoriaId = l.CategoriaId, Nome = l.Nome, NomeAll = parentNomeAll + " > " + l.Nome, NivelAll = parentIdAll + " > " + l.CategoriaId, SubCategorias = GetChildren(categorias, l.CategoriaId, parentNomeAll + " > " + l.Nome, parentIdAll + " > " + l.CategoriaId), SubCategoriaId = l.SubCategoriaId }).ToList(); }
utilizo assim:
var categorias = GetChildren(_unitOfWork.Categoria.GetAll().ToList());
mas na real, não gostei de nenhuma das opções. =(
alguém teria uma dica ou sugestão? Qual seria a melhor opção?
-
encontrei tambem sobre um tipo de dado hierarchyid do SQLServer muito pouco conhecido
https://www.sqlshack.com/use-hierarchyid-sql-server/