2010-10-02 6 views
1

Voici la configuration.Utilisation de nhibernate pour filtrer la valeur d'un objet dans une collection enfant

NHibernate, Courant NHibenrate et NHibernate Linq

Les entités invoved sont

  • défaut - un record d'un défaut survenant
  • Alarme - informations sur la faute, penser comme un type de défaut (une liste de tous les défauts possibles qui peuvent se produire)
  • AlarmDescription - description lisible par l'homme, un pour chaque langue

Un défaut a une alarme et l'alarme a une collection de descriptions, une pour chaque langue dans le système.

Une alarme peut être référencée par de nombreux défauts.

Lorsqu'un utilisateur effectue une recherche dans l'un des paramètres, il peut rechercher (et trier) les défauts en fonction de sa description. Ce qui signifie transmettre la langue spécifique à utiliser.

SQL pour accomplir est le cerveau mort simple pour commencer:

SELECT f.*, a.*, d.Description 
FROM Fault f 
JOIN Alarm a ON f.Alarm_id = a.Id 
JOIN AlarmDescription d ON a.Id = d.Alarm_id AND d.Language = @lang 

La requête ci-dessus me donnerait la faute, leur alarme et les descriptions de la langauge sélectionnée. Cependant, obtenir Nhibernate pour générer une telle requête s'avère difficile. Ainsi, il se résume à l'un des filtres étant un objet Child Collection of Child de l'objet principal. J'ai essayé de travailler avec Linq2Nhibenrate, HQL et d'essayer de faire fonctionner Native SQL. Le SQL natif semble le plus susceptible de réussir mais je n'arrive pas à comprendre comment mapper correctement les alias. Je suis prêt pour toute solution, y compris la modification du modèle de domaine. Celui-ci m'a fait perplexe.

Répondre

0

Voici un HQL possible:

select f, d.Description 
from Fault f 
join fetch f.Alarm a 
join a.Descriptions d 
where d.Language = :lang 

Cette récupère une liste de tuples (object[2]) où le premier élément est un défaut (avec une alarme initialisées), et le second est le texte de description sélectionné la langue.

+0

On dirait que ça va marcher, merci! Je n'avais pas pensé à rejoindre la collection pour enfants comme ça. – Lance

Questions connexes