12
votes

Querlerover NHibernate: Comment rejoindre des entités non liées?

J'ai la requête suivante qui travaille qui obtient les résultats que je veux: xxx

the databaseView a été mappé comme une entité de NHibernate réelle (afin que je puisse l'utiliser avec Queryover ), mais il n'est pas associé à myObject dans les mappages HBM.

Cette requête renvoie un iliste Utilisation d'un Sélectionnez ... à partir de MyObject où existe (sous-requête pour DatabaseView ici) . Comment puis-je ré-écrire ceci pour renvoyer les mêmes données, mais utiliser une jointure au lieu de sous-requête?


0 commentaires

3 Réponses :


6
votes

Vous pouvez vous joindre à des entités non liées avec Linq dans NHibernate 3+

assez drôle que vous utilisez le joindre code> Elément d'expression de requête: p>

from type1 in Repository.Query<MyType1>() 
join type2 in Repository.Query<MyType2>() 
on type1.Id equals type2.Id


1 commentaires

Cela fonctionne réellement lors de la jonction avec deux instances iquéryable . Je suis émerveillé que cela fonctionne avec la mise en œuvre LINQ ( Query <> ), mais pas avec Queryover <>



3
votes

Je réalise que cette question a 5 ans et la réponse "correcte" est définitivement que vous ne pouvez pas le faire avec Querlerover, car les autres réponses indiquent. Cependant, si vous vraiment em> strong> besoin de cette fonctionnalité (comme je l'ai fait), il y a une solution de contournement décente que j'ai trouvée.

La solution consiste à utiliser une "requête de chargeur" ​​avec sql natif dans votre mappage XML pour produire une collection associée (voir http://nibernate.info/doc/nibernate-reference/Quiserysql.html#querysql-load ). Dans l'exemple spécifique de l'OP, vous allez aller de l'avant et cartographier votre DatabaseView code> comme une entité comme suggérée, puis écrivez ce qui suit dans votre mappage: p> xxx pré>

Ensuite, nous devons simplement définir notre nommé MyObitViewsloadQuery code> dans RAW SQL pour expliquer à NH Comment rejoindre les deux: p>

MyObject alias = null;
DatabaseView view = null;
var results = session.QueryOver<MyObject>(() => alias)
     .JoinAlias( () => alias.MyViews, () => view )
     //.Where( () => view.Property == "myValue" ) // optionally, restrict the view etc.
     .List();


0 commentaires