0 votes

Ajouter des critères pour filtrer par un parent auto-référencé ?

Je suis perplexe sur ce point. J'ai une relation d'autoréférence multiple (FluentNH) mappée pour une classe donnée :

public class Folder
{
    public IList<Folder> ParentFolders{get;set;}
}

Je cherche à créer une requête qui tire des dossiers Root( c'est-à-dire les dossiers qui ont ParentFolders.Count() == 0 ). L'autoréférence se fait par le biais d'une table de consultation, de sorte que ParentFolderID n'est pas réellement accessible depuis la classe (il n'apparaît que dans le mappage).

public IList<Folder> GetRootFolders()
{
    return session.CreateCriteria<Folder>()
        .outofideas()
        .List<Folder>();
}

Toute aide ou réflexion sur une hiérarchie autoréférentielle via une table de consultation sera appréciée. Les tables elles-mêmes sont héritées et ne peuvent donc pas être modifiées.

0voto

EMP Points 17246

J'ai toujours trouvé que la méthode NHibernate Criteria difficile de travailler avec. (C'est-à-dire que même plus difficile que le reste de NHibernate). Essayez plutôt de créer une requête HQL. Sans voir le fichier de mappage, je ne peux pas écrire la requête pour vous, mais ce serait quelque chose comme :

session.CreateQuery("FROM Folder f WHERE COUNT(f.ParentFolders) = 0")

Il faudrait que vous jouiez un peu avec la syntaxe, j'écris ceci de mémoire. Notez que NHibernate est assez intelligent pour effectuer une sous-requête pour le COUNT - il ne chargera pas réellement tous vos dossiers parents et puis les compter.

0voto

tolism7 Points 1857

Si votre cartographie a quelque chose comme ça :

<bag name="ParentFolders" table="FolderFolder" lazy="true">
    <key column="FolderID"/>
    <many-to-many class="Folder" column="ParentFolderID"/>
</bag>

alors si vous écrivez :

var folders = Session.CreateCriteria<Folder>("folder")
    .Add(Restrictions.IsEmpty("ParentFolders")).List<Folder>();

vous obtiendrez ce SQL :

SELECT *
FROM Folder folder 
WHERE not exists (select 1 from FolderFolder where folder.FolderID=FolderID)

qui, je crois, fait l'affaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X