2009-07-31 14 views
0

LinqからNHibernateは、単一のクエリで複数のエンティティからデータを取得することをサポートしていますか?LinqからnHibernateへの複数のエンティティのクエリ?

例えば:BuildingFloorの親エンティティである

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

答えて

1

NHibernateがこれをネイティブにサポートしているので、可能である必要があります。しかし、LinqとNHibernateの経験はありません。

クエリを試しましたか?はいの場合、応答は何ですか?

+0

例外: { "インデックスが配列の範囲外であった。"} は、インスタンス化できませんでした:VB $ AnonymousType_0'4 [ [可能System.Int32、mscorlib、バージョン= 2.0.0.0を、文化= PublicKeyTokenニュートラル= b77a5c561934e089]、 [可能System.String、mscorlib、バージョン= 2.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089]、 [可能System.Int32、mscorlib、バージョン= 2.0.0.0、文化=中立、なPublicKeyToken = b77a5c561934e089]、 [System.String、mscorlib、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089]] ただし、SQLの出力は次のとおりです。SELECT id、name FROM floor - 結合のエビデンスはありません。 – Starfield

2

session.LinqでExpandメソッドを使用する必要があります。例えば(C#で申し訳ありません)、

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

または、ICriteriaが使用されている場合 - ICriteria.SetFetchMode( "Building"、FetchMode.Eager); –

+2

問題のみです。このアプローチは、「リポジトリ」パターンでは少し面倒です。 –

+0

はい、リポジトリパターンでは少し難しいかもしれません。しかし、私は通常、クエリを含むIQueryableプロパティを持つカスタムインターフェイス(IDomainQueryなど)と、リポジトリがlinq.Expandを呼び出すために使用する文字列の配列を返す 'ExpandStrings'プロパティを持つrepoメソッドを持っています。あなたはそれについてどう思いますか教えてください。 – Simon

1

私はExpandで遊んでいます。リポジトリパターンについての興味深い点。

@ Simonの例では、魔法の文字列 "Building"の匂いがすぐに当たったものです。私は最終的にMarcin Budnyからのこのブログ記事に出くわしました。

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

は私に適しています。

+0

うん、私はPerhentian自分自身の正確な考えを持っていた!私はそれを読者のための練習として残しました;-)。インデクサー(ISetのようなもの)を持たない子コレクションの周りで問題に遭遇しました。そのための簡単な解決策は考えられませんでした。私はMarcinが品質のSubPathのものを作ったことに気付きました。私は今から彼のソリューションを使用すると思います。フィードバックをお寄せいただきありがとうございます。 – Simon

関連する問題