none
AUTO RELACIONAMENTO EF ASPNET CORE 2 RRS feed

  • 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?
    sábado, 14 de abril de 2018 22:42

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; }
    
    
        }

    sábado, 14 de abril de 2018 22:46
  • 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.

    segunda-feira, 16 de abril de 2018 20:22
    Moderador
  • 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?

    quarta-feira, 18 de abril de 2018 12:00
  • encontrei tambem sobre um tipo de dado   hierarchyid do SQLServer muito pouco conhecido

    https://www.sqlshack.com/use-hierarchyid-sql-server/  
    quarta-feira, 18 de abril de 2018 21:20