2010-04-12 3 views
0

Mon scénario est le suivant: J'ai une base NHibernate requête à exécuter de la forme (je l'ai codé à l'aide DetachedCriteria, mais le décrire ici en utilisant la syntaxe SQL):En NHibernate, comment puis-je combiner deux instances DetachedCriteria

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key 

l'interface utilisateur pour afficher les résultats de cette jointure permet à l'utilisateur de spécifier des critères supplémentaires: Dis:

I.SomeField = 'UserValue'. 

maintenant, je dois la commande de charge finale soit:

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key 
WHERE I.SomeField = 'UserValue' 

Mon problème est: J'ai créé un DetachedCriteria avec l'aspect 'static' de la requête (la jointure supérieure) et l'interface utilisateur crée un DetachedCriteria avec le composant 'dynamic' de la requête. J'ai besoin de combiner les deux dans une dernière requête que je peux exécuter sur la session NHibernate. DefaultCriteria.Add() prend un ICriterion (qui est créé à l'aide de la classe Expression, et peut-être d'autres classes que je ne connais pas qui pourraient être la solution à mon problème).

Est-ce que quelqu'un sait comment je pourrais faire ce que je veux?

Répondre

1

Vous pouvez utiliser GetExecutableCriteria pour transformer un critère détaché en une forme exécutable pour une session spécifique:

var query = DetachedCriteria.For<...>(); 

using (var session = ...) 
using (var transaction = session.BeginTransaction()) 
{ 
    query.GetExecutableCriteria(session) 
    transaction.Commit(); 
} 

Cependant, je pense que votre conception est un peu défectueux. L'interface utilisateur devrait compléter les critères, ne créant pas les siens. Au pire, il devrait générer ICriterion qui sont ensuite ajoutés à vos critères avant l'exécution. Au mieux, vous pouvez faire abstraction des capacités de filtrage dans une couche complètement indépendante de votre technologie ORM, puis appliquer des filtres de l'interface utilisateur à vos critères sous-jacents.

+0

Merci Kent. Je suis arrivé à la même conclusion après avoir posté la question. J'ai changé mon 'UI' (c'est en fait le code DTO Factory, pas vraiment l'interface utilisateur) pour générer ICriterion. Bon point sur la mise à distance de l'ORM - Je devrais créer mes propres critères décrivant les classes, puis les utiliser pour générer des critères NHibernate appropriés plus bas dans la pile. – Trevor

Questions connexes