2009-07-31 6 views
0

Unterstützt Linq-zu-NHibernate das Abrufen von Daten aus mehreren Entitäten in einer einzigen Abfrage?Linq-zu-nHibernate Abfrage mit mehreren Entitäten?

z.B .:

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() 

Wo Building ist die Muttergesellschaft von Floor.

Antwort

1

Es sollte möglich sein, wie NHibernate dies nativ unterstützt. Ich habe jedoch keine Erfahrung mit Linq-zu-NHibernate.

Haben Sie die Abfrage versucht, und wenn ja, was war die Antwort?

+0

Ausnahme: { "Index außerhalb der Grenzen des Arrays war."} konnte nicht instanziiert: 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, Kultur = neutral, PublicKeyToken = b77a5c561934e089]] Die SQL-Ausgabe ist jedoch: SELECT ID, Name FROM Stock - also kein Beweis für eine Verknüpfung. – Starfield

2

Sie müssen die Expand-Methode für session.Linq verwenden. Zum Beispiel (Sorry, in C#),

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

Oder, wenn ICriteria verwendet wird - ICriteria.SetFetchMode ("Building", FetchMode.Eager); –

+2

Nur Problem ist - dieser Ansatz ist ein bisschen unfreundlich mit "Repository" -Muster. –

+0

Ja, es kann mit dem Repository-Muster ein wenig schwierig sein. Normalerweise verfüge ich jedoch über eine Repomethode, die eine benutzerdefinierte Schnittstelle (wie IDomainQuery) mit einer IQueryable-Eigenschaft, die die Abfrage enthält, und eine ExpandStrings-Eigenschaft enthält, die ein Array mit Strings zurückgibt, mit denen das Repository linq.Expand aufruft. Lass mich wissen, was du davon hältst? – Simon

1

Ich habe mit Expand gespielt. Interessanter Punkt über das Repository-Muster auch.

Die Sache, die mich sofort traf, war der Geruch der magischen Saite "Building" in @Simons Beispiel. Ich bin schließlich auf diesen Blogbeitrag von Marcin Budny gestoßen.

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

funktioniert gut für mich.

+0

Ja, Perhentian hatte ich genau diesen Gedanken! Das habe ich als Übung für den Leser einfach gelassen ;-). Ich habe das Problem mit Kindersammlungen ohne Indexer (wie ISet) angegangen und konnte mir keine schnelle Lösung vorstellen. Ich stelle fest, dass Marcin das SubPath-Zeug dafür erstellt hat, was Qualität ist. Ich denke, ich werde seine Lösung von jetzt an verwenden. Danke für die Rückmeldung. – Simon