2011-07-20 10 views
2

私のアマチュアの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(....)しかし、それはフェッチされたものに何の影響も与えなかった。

答えて

3

sqlでフィルタリングとフェッチを同時に行うことはできません。私はまだそれ以上のクエリに精通していないが、あなたはアイデアを取得する必要があります。

var subquery = DetachedCriteria.For<Notification>() 
    .CreateAlias("Parameters", "p", JoinType.InnerJoin) 
    .Add(Restrictions.Where<Notification>(x => x.Acknowledged == false)) 
    .Add(Restrictions.In("p.PairHash", npHashes)) 
    .SetProjection(Projections.Id()); 

session.CreateCriteria<Notification>() 
    .Add(Subqueries.PropertyIn("Id", subquery)) 
    .SetFetchMode("Parameters", FetchMode.Eager) 
    .AddOrder(Order.Asc("DateCreated")) 
    .List<Notification>(); 
+0

私はSELECTフェッチをしていますが(私は外部結合へのマップと思います)、フィルタリングとフェッチはお互いに影響しないはずです。 – Sam

関連する問題