2009-07-31 10 views
0

Linq-to-NHibernate prend-il en charge la récupération des données de plusieurs entités dans une même requête?Linq-to-nHibernate Requête avec plusieurs entités?

par exemple .:

Dim query = From f In context.Session.Linq(Of Floor)() _ 
      Select f.Id, f.Name, f.Building.Id, f.Building.Name 

Dim results = query.ToList() 

Lorsque Building est l'entité mère de Floor.

Répondre

1

Cela devrait être possible car NHibernate le supporte nativement. Pourtant, je n'ai aucune expérience avec Linq-to-NHibernate.

Avez-vous essayé la requête, et si oui, quelle était la réponse?

+0

Exception: { "index était en dehors des limites du tableau."} ne pouvait pas instancier: VB $ AnonymousType_0'4 [ [System.Int32, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.Int32, mscorlib, version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089], [System.String, mscorlib, Version = 2.0.0.0, Culture = Neutre, PublicKeyToken = b77a5c561934e089]] Cependant, la sortie SQL est: SELECT id, nom FROM floor - donc pas de preuve d'une jointure. – Starfield

2

Vous devrez utiliser la méthode Expand sur session.Linq. Par exemple (désolé, en C#),

var linq = session.Linq<Floor>(); 
linq.Expand("Building"); //causes "Building" to be eagerly loaded. 
//Then your linq query goes here... 
+0

Ou, si ICriteria est utilisé - ICriteria.SetFetchMode ("Building", FetchMode.Eager); –

+2

Seul problème est - cette approche est un peu hostile avec le modèle 'repository'. –

+0

Oui, cela peut être un peu difficile avec le modèle de dépôt. Cependant, j'ai normalement une méthode repo qui prend une interface personnalisée (comme IDomainQuery) qui a une propriété IQueryable qui contient la requête, et une propriété 'ExpandStrings' qui retourne un tableau de chaînes que le référentiel utilise pour appeler linq.Expand. Dites-moi ce que vous en pensez? – Simon

1

J'ai joué avec Expand. Point intéressant sur le modèle Repository aussi. La chose qui m'a tout de suite frappé, c'est l'odeur de la chaîne magique "Building" dans l'exemple de @ Simon. J'ai finalement rencontré ce blog de Marcin Budny.

http://marcinbudny.blogspot.com/2009/10/typed-expand-for-linq-to-nhiberante.html

fonctionne bien pour moi.

+0

Oui, j'avais cette pensée exacte moi-même Perhentian! Je viens de laisser cela comme un exercice pour le lecteur ;-). J'ai rencontré le problème des collections enfants sans indexeur (comme ISet), et je ne pouvais pas trouver une solution rapide à cela. Je remarque que Marcin a créé les trucs SubPath qui sont de qualité. Je pense que je vais utiliser sa solution à partir de maintenant. Merci pour les commentaires. – Simon

Questions connexes