2010-11-25 6 views
1

J'essaie de déterminer comment effectuer les opérations suivantes à l'aide de l'API Criteria.Utilisation de SQLProjection sur une entité associée avec NHibernate

J'ai 3 entités connexes, par exemple. Locataire, immeuble et propriétaire où un locataire a une propriété de construction et un bâtiment a une propriété de propriétaire. Le propriétaire a les propriétés Prénom et Nom.

Je veux récupérer tous les locataires et les propriétaires nom complet

-à-dire le SQL serait

select o.FirstName + ' ' + o.LastName as OwnerName, t.Name from Tenant t inner join Building b on t.BuildingId = b.BuildingId inner join [Owner] o on b.OwnerId = o.OwnerId

Lorsque je crée une requête pour le locataire en utilisant l'API de critères, est-il un moyen peut ajouter une projection qui va me donner le nom du propriétaire concaténé? (Je n'ai pas découvert comment ajouter une SQLProjection pour autre chose que l'entité racine)

Merci.

Répondre

1

Ajoutez à chaque ICriteria (chaque entité) un alias. Ensuite, dans la projection, vous pouvez utiliser la notation:

*alias.property* 

Concaténation que vous devriez faire au sein de votre objet DTO.

+0

Merci, je suis en train de faire quelque chose comme ça, mais je veux savoir s'il est possible de générer du SQL comme ci-dessus en utilisant l'API Criteria. –

0

À mon avis/objet DTO (tout ce que vous voulez l'appeler), j'ajouter une propriété supplémentaire comme celui-ci:

public MyDTO 
{ 
    public string FirstName 
    { 
     get; 
     private set; 
    } 

    public string LastName 
    { 
     get; 
     private set; 
    } 

    public string Name 
    { 
     get 
     { 
      return String.Format ("{0} {1}", FirstName, LastName); 
     } 
    } 
} 
+0

J'ai tendance à éviter les propriétés 'calculées' comme cela dans mes DTO car le code client ne sait pas que la propriété ne peut pas être interrogée. Mieux vaut utiliser quelque chose comme string fullName = NameFormatter.Format (prénom, nom, nomFormat.PrénomNameSpaceNom) je pense. – David

0

Malheureusement, je ne l'utilise l'API ICriteria donc je ne peux pas aider vous avec cela spécifiquement. Cependant, avec LINQ to NHibernate Je suis sûr que vous seriez en mesure de faire quelque chose comme ceci:

var tenantsAndOwners = session.Linq<Tenant>().Select(tenant => new { TenantName = tenant.Name, OwnerFullName = tenant.Building.Owner.FirstName + " " + tenant.Building.Owner.LastName }); 

Ce serait retourner un type anonyme avec les deux propriétés de la TenantName 'et « OwnerFullName ». Le type anonyme n'existe que dans la portée actuelle, c'est-à-dire qu'il ne peut pas être transmis en tant que type de retour d'une méthode. J'ai peur que ce code ne soit pas testé car je suis trop occupé à serrer mon café et à frissonner, mais je suis sûr que quelque chose comme ça marcherait. Et Linq à NHibernate est absolument génial.

Questions connexes