2009-11-24 3 views
1

J'ai une relation de table parent-enfant: Elements - (1 à n) -> ContentBlocks. Chaque ligne ContentBlock a: Id unique (Id), ElementId, Version, puis certains champs moins pertinents. J'essaye d'obtenir toutes les lignes de contenu qui ont le numéro de version le plus élevé (et l'identification) sur eux.NHibernate: Comment utiliser "IN" avec CreateCriteria?

J'ai cette ligne de SQL qui me donne ce que je veux:

SELECT * FROM ContentBlocks WHERE Id IN 
    (SELECT MAX(Id) FROM ContentBlocks GROUP BY ElementId) 

(cela suppose que la dernière version a le plus Id)

Cependant, je ne peux pas comprendre comment obtenir de NHibernate. Ceci est le plus proche, je suis devenu:

var subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(Projections.Max("Id")) 
      .SetProjection(Projections.GroupProperty("ElementId")); 

var query = session.CreateCriteria<ContentBlock>() 
      .Add(Subqueries.PropertyIn("Id", subquery)).List<ContentBlock>(); 

Si j'exécute sous-requête, je reçois une liste des ElementIds unique dans la table. Au lieu de cela, j'ai besoin de la liste des ID des ContentBlocks les plus récents. Si j'inverse l'ordre des SetProjections sur la sous-requête, j'obtiens juste le maximum de ElementId.

J'ai essayé aussi de cette façon:

 subquery = DetachedCriteria.For<ContentBlock>() 
      .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.Max("Id")) 
        .Add(Projections.GroupProperty("ElementId")) 
       ); 

mais qui me fait une liste de tableaux avec 2 éléments, il Id & elementid, que le processus d'appel createCriteria ne peut pas.

Existe-t-il un moyen de ne pas inclure la propriété groupée "ElementId" dans les résultats? Ou spécifiez que je souhaite renvoyer Max (Id) à la place?

Répondre

Questions connexes