私のアマチュアのnhibernate-nessを許してください。しかし、私は以下のシナリオでフェッチするのに苦労しています。SetFetchModeの使用
var query = session.CreateCriteria<Notification>().SetFetchMode("Parameters", FetchMode.Select)
.CreateAlias("Parameters", "p", JoinType.InnerJoin)
.Add(Restrictions.Where<Notification>(x => x.Acknowledged == false));
[IListのを構築するいくつかのコードが呼び出さnpHashes]
query = query.Add(Restrictions.In("p.PairHash", npHashes)).AddOrder(new Order("DateCreated", false));
私はprefetchmodeとして明らかに残されてしまった...オプションをSELECTを使用しています
注[それを列挙] Out of QueryOver ...とLINQ ...フェッチされたテーブルは、私がフィルタリングするために結合したのと同じテーブルです。この中にそのクエリ結果実行
:
SELECT
this_.Id as Id14_1_,
this_.Version as Version14_1_,
this_.Url as Url14_1_,
this_.DispatchType as Dispatch5_14_1_,
this_.Acknowledged as Acknowle6_14_1_,
this_.DateCreated as DateCrea7_14_1_,
this_.NotificationType as Notifica2_14_1_,
p1_.Id as Id15_0_,
p1_.Version as Version15_0_,
p1_.NotificationId as Notifica3_15_0_,
p1_.Name as Name15_0_,
p1_.Value as Value15_0_,
p1_.PairHash as PairHash15_0_
FROM
Notification this_
inner join
NotificationParameter p1_
on this_.Id=p1_.NotificationId
WHERE
this_.Acknowledged = ?p0
and p1_.PairHash in (
?p1
)
ORDER BY
this_.DateCreated desc;
?p0 = False [Type: Boolean (0)],
?p1 = 'V3zmXnv12B3AC26xeG10w+bas4U=' [Type: String (28)]
をだから、最初の問題は、列が選択リストに含まれているNotificationParameter何らかの理由で...それはフェッチの選択をしていることがないように見えます。これは悪いです。なぜなら、a)選択フェッチが必要です。b)フェッチレコードがフィルタリングされています。フェッチはコンバインと同じではなく(コンセプトとして)、結合されたデータのフィルタは(この場合は)フェッチするものをフィルタリングするべきではありません。
もちろん、セカンド発行ではSELECTフェッチが行われませんでした。通知のParametersプロパティに最初にアクセスする代わりに、遅延ロードされます。O
助けが必要ですか?また、QueryOverを使用してこれを行う方法については、私はそれを好むでしょう。私は行くことができることに気づいた。しかし、UnterlyingCriteria.SetFetchmode(....)しかし、それはフェッチされたものに何の影響も与えなかった。
私はSELECTフェッチをしていますが(私は外部結合へのマップと思います)、フィルタリングとフェッチはお互いに影響しないはずです。 – Sam