Pergunta

Eu tenho uma tabela de auto-referência com uma Id, NomeDaCategoria, e ParentId. É um cenário típico de uma tabela de hierarquia de categorias que se podem ser divididos em categorias que especialistas DB dizer-me é chamado o modelo de adjacência.

O que eu quero é usar LINQ to SQL para consulta para subcategorias que se estão relacionados com nenhuma outra subcategorias, ou seja, eles são nós imediatos folha de alguma determinada categoria ou subcategoria.

A parte mais fácil, eu tenho, que está apenas começando as subcategorias. Quase vergonha de colocar o código aqui. Mas nós gostamos de ver o código ..

IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();  

Mas estreitando-lo para categorias sem subcategorias é me virar. Qualquer ajuda seria muito apreciada.

Obrigado por ajudar. Jeff

Atualização ** Parece isso funciona, mas se alguém pudesse confirmar que ele é "adequada" Eu ficaria grato. Então, se eu quiser nós folha em uma categoria com id = 1, eu faria isso:

Categories.Where( c => !c.Children.Any ( d => d.ParentId == c.Id)).Where( e => e.ParentId == 1) 

"Crianças" é o nome Linq dá a associação de auto-referência.

Foi útil?

Solução

A sua solução está correta porque o método Any(), se traduz em sql "existe ()" função e !c.Children.Any ( d => d.ParentId == c.Id)) traduz em uma cláusula SQL semelhante ao NOT EXISTS (SELECT * FROM Categories WHERE ParentID = outerRef.ID)

Outra maneira de fazer isso é usar Count:

Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)

Mas normalmente existe () é o preferido para COUNT () no SQL (por motivos de desempenho) para a solução com Any () deve ser o caminho certo.

Outras dicas

Eu acho que se eu entendi sua pergunta você está tentando obter todos os elementos filho que não têm filhos de lá próprio ... esta auto consulta junta-se à mesa em si mesmo para testar se o nó é usado como um pai , se não é, em seguida, ele é exibido no resultado.

Eu não tenho certeza se isso funciona como eu não tenho nada a testá-lo em ...

   (from c in context
    join cc in context on c.id equals cc.parentid into temp
    from t in temp.DefaultIfEmpty()
    where t == null
    select c).ToList()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top