2010-05-07 8 views
0

J'essaie de faire une projection sur un type appelé Log. Le journal fait référence à une superclasse appelée Société. Chaque type de société est mappé avec une table par sous-classe.Obtenir le type de sous-classe à partir de la projection avec NHibernate

moi Est-il possible d'obtenir le type de société quand je fais une projection sur Log? J'ai actuellement une propriété Enum (qui n'est pas mappée) sur chaque sous-classe, donc je peux effectuer des commutations sur les types Company, mais comme elle n'est pas mappée sur quelque chose, je ne peux pas faire de projection dessus.

J'ai essayé Projections.Property("log.Company.class") mais cela ne fonctionne pas :(

PS:.. Je ne pouvais pas trouver beaucoup de balises appropriées pour cette question Si quelqu'un a une idée des balises plus spécifiques, s'il vous plaît me dire

Répondre

1

Vous pouvez faire ce qui suit ...

session.CreateCriteria<Log>() 
     .CreateAlias("Company", "company") 
     .SetProjection(Projections.Property("company.class")) 

Mais cette projection ne peut être utilisé pour le filtrage et la commande, NHibernate ne retournera pas le System.Type dans le jeu de résultats (il renvoie un entier, ce qui est utilisé en interne)

Si ce que vous avez besoin est de connaître le type concret de la Société, vous pouvez effectuer les opérations suivantes:

var logs = session.CreateCriteria<Log>() 
        .SetFetchMode("Company", FetchMode.Join) //avoid SELECT N+1 
        .List<Log>() 

Et puis, pour récupérer le type pour chaque ligne:

foreach (var log in logs) 
    string companyClassName = session.GetEntityName(log.Company); 
+1

Est-ce prévisible? Je veux dire, est-ce que je peux traduire cela en une chaîne, qui est ce dont j'ai besoin, pour afficher le type d'entreprise? – Siewers

+0

Cela peut être prévisible, mais seulement par ingénierie inverse. Je vais ajouter une alternative pour ce dont vous avez besoin. –

+0

Cela semble bien, mais ne serait-ce pas une jointure quoi qu'il arrive, car j'utilise une table par sous-classe? Je vais tenter le coup :) – Siewers

Questions connexes