2010-02-11 4 views
2

Supposons que je la structure de classe suivante:NHibernate se collecte dans une autre collection lors de la requête

public class State 
{ 
    public int Id { get; set; } 
    public DateTime StatehoodDate { get; set; } 
    public IList<City> CityList { get; set; } 
} 

public class City 
{ 
    public int Id { get; set; } 
    public string CityName { get; set; } 
} 

liée aux tableaux suivants NHibernate:

CREATE TABLE tblState (
    StateId int, 
    StatehoodDate datetime, 
) 

CREATE TABLE tblCity { 
    CityId int, 
    StateId int, 
    CityName varchar(1000) 
} 

* Note: Supposons pour cet exemple, il y a seulement 5-10 villes par état. Ceci est un exemple obscurci. *

Je veux obtenir tous les états avec une StatehoodDate après 1900. Je veux également une liste des villes dans cet état chargé automatiquement, donc pas de chargement paresseux. Comment puis-je interroger cela dans NHibernate dans une seule requête? (HQL, Criteria, etc n'a pas d'importance - je vais utiliser tout ce qui fonctionne.)

J'espère qu'il y a un moyen de récupérer toutes les données dans une requête, puis faire un équivalent de "GROUP BY" à obtenir une liste de seulement les états avec un StatehoodDate après 1900. Dans mon exemple, je vais toujours afficher les villes chaque fois que cette requête est exécutée.

chargement Lazy est évidemment une option, mais il y a un coup de performance, car il y aurait la requête initiale (la date), puis une requête

Répondre

2
session.CreateCriteria<State>() 
    .SetFetchMode("CityList", NHibernate.FetchMode.Join) 
    .Add(Restrictions.Gt("StatehoodDate", new DateTime(1900,1,1))) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<State>(); 

Cela vous obtenir tous ces états avec la liste ville pré-chargé.

Si vous ne voulez pas des entités étatiques et veulent juste afficher l'état & des données de la ville, vous pouvez simplement projeter ces valeurs sur un objet DTO et afficher que ...

class CityView 
{ 
    public string StateName { get; set; } 
    public string CityName { get; set; } 
} 

session.CreateCriteria<State>() 
    .CreateAlias("CityList", "cl") 
    .Add(Restrictions.Gt("StatehoodDate", new DateTime(1900,1,1))) 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("StateName"), "StateName") 
     .Add(Projections.Property("cl.CityName"), "CityName")) 
    .SetResultTransformer(Transformers.AliasToBean<CityView>()) 
    .List<CityView>(); 
Questions connexes