NHibernateの.Fetch()
拡張メソッドの呼び出しで生成されたSQLクエリの内部結合が行われるようにクエリ(またはマッピング)を変更することはできますか?Linqクエリの内部結合フェッチ
これは簡単です。left join fetch
の代わりにinner join fetch
と書かなければなりませんが、Linqではそれを見つけることができませんでした。
NHibernateの.Fetch()
拡張メソッドの呼び出しで生成されたSQLクエリの内部結合が行われるようにクエリ(またはマッピング)を変更することはできますか?Linqクエリの内部結合フェッチ
これは簡単です。left join fetch
の代わりにinner join fetch
と書かなければなりませんが、Linqではそれを見つけることができませんでした。
これはまだできていないので、私はそれのためJIRA課題を作成しました:NH-2790
LINQでJOIN型を制御できるかどうかは不明ですが、引き続きQueryOver APIを使用してJOIN型を制御する厳密に型指定されたクエリを使用できます。
var ordersWithCustomers = Session.QueryOver<Order>()
.JoinQueryOver(o => o.Customer,JoinType.InnerJoin) //You can specify join type
.List();
また、私はちょうどこれを試し、それがクエリで結合の種類に違いはありませんでしたが、あなたのマッピングでnot-null="true"
を追加してみてください。
Wierdlyこれは内部結合(古いANSI SQL結合構文を使用)では機能しますが、Customerをフェッチしません。
var ordersWithCustomers =
from o in Session.Query<Order>()
join c in Session.Query<Customer>() on o.Customer.Id equals c.Id
select o;
UPDATE 2:
https://www.nuget.org/packages/NHibernate.Linq.InnerJoinFetch
お楽しみに!
UPDATE:私は最終的にこれを行うために管理し、NHチームにfollowignプルリクエストを送信し
https://github.com/nhibernate/nhibernate-core/pull/210
実際には、それは可能ですが、あなたはNHibernateはをハックする必要があります、変更する行は、この1
tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias)));
ですProcessFetch.csで
tree.AddFromClause(tree.TreeBuilder.FetchJoin(join, tree.TreeBuilder.Alias(alias)));
が
をファイルには、動作がLINQのためにハードコードされているようだと私はそのそののDefaultQueryProviderと再LINQのために使用するものを送信するために、拡張メソッドを使用しているためだと思います処理するには、linq apiを使用してeager fetchingを行いたい結合の種類を指定する方法をまだ理解しておく必要がありますが、私はそれに取り組んでいます。うまくいけばNHチームにプルリクエストを送信してこれはコードベースに、私のプロジェクトでは私のカスタムNHのバージョンを使用します
素晴らしい拡張ですが、nhibernate 4を使用しています。プロジェクトに追加すると、nugetはnhibernateを3.3に設定しました。現在のバージョンのnhibernateに新しいバージョンを提供する方法はありますか?または私のプロジェクトにどのように追加できますか? –
少なくともQueryOverの提案に感謝します。 HQLよりも。私も 'not-null = true 'を試しました。あなたが言ったように、それは何も変わりません。 – cremor
LINQ式の構文例で更新しても問題は解決しませんが、別の考えがあります。 –
私は 'Fetch()'と組み合わせて試しました。作業はしているようですが、非常に醜い非効率なSQLを生成します(Order JoinのようなものOrderJoinTableはOrderJoinTable2への参加を残しました、CustomerはJoin JoinJoinTableへのJoinJetinTable2へのOrder.ID = Customer.ID'のOrderJoinTablesは )。 –
cremor