2009-11-20 4 views
2

Celui-ci me fait mal à la tête (ce qui est facile puisque je suis un novice de NHibernate): comment puis-je représenter la requête suivante (T-SQL) via l'API Criteria?Comment créer un critère dans NHibernate qui représente un OU entre deux EXISTS?

DECLARE @pcode VARCHAR(8) 
SET @pcode = 'somecode' 

SELECT d.* 
FROM document d 
WHERE EXISTS (
      SELECT 1 
      FROM project p 
      WHERE p.id = d.projectId AND p.code = @pcode) 
     OR EXISTS (
      SELECT 1 
      FROM job j INNER JOIN project p ON p.id = j.projectId 
      WHERE j.id = d.jobId AND p.code = @pcode) 

(. Un document a deux associations possibles, un projet ou d'emploi Un seul d'entre eux a une valeur à un moment donné, l'autre a null.)

Le but est de charger tous les documents qui sont directement associé à un projet donné ou indirectement à travers un Job.

Merci.

Répondre

2

Je pense que cela pourrait faire l'affaire:

DetachedCriteria dCriteria1 = DetachedCriteria.For<Project>("project") 
     .SetProjection(Projections.Property("project.Id")) 
     .Add(Restrictions.EqProperty("doc.projectId", "project.Id")); 

DetachedCriteria dCriteria2 = DetachedCriteria.For<Job>("job") 
      .SetProjection(Projections.Property("job.Id")) 
      .CreateCriteria("Projects", "p") 
      .Add(Restrictions.EqProperty("doc.jobId", "job.Id")) 
      .Add(Restrictions.Eq("p.code", "somecode")); 

var documents = NHibernateSessionManager.Session.CreateCriteria<Document>("doc") 
     .Add(Restrictions.Or(
      Subqueries.Exists(dCriteria1), 
      Subqueries.Exists(dCriteria2))).List<Document>(); 

Le code ci-dessus est dérivé de l'exemple de requête que vous avez fourni. Si ce n'est pas tout à fait exact, vous pouvez le modifier un peu pour le rendre utilisable dans votre solution.

+0

Juste eu à changer certains noms (pour refléter mes entités) et a travaillé comme un charme. Merci. – ssarabando

Questions connexes