2012-03-15 8 views
1

次のnhibernateクエリは、子テーブルが指定された条件に一致する複数の行を持つので、同じ行を1回返します。私が知りたいと思うのは、この同じクエリを実行するだけでDataMappingBaseの各行を一度取得するだけで、nhibernateで最も効率的な/ベストプラクティスです。同じ行の複数を返すことは、私が25を制限しようとするときに返される結果の数に違反しますが、時には同じ行を25回取得することがあります。私は現在、デタッチクエリに上記のクエリを変換すると「取る」条項を削除し、ちょうど一致する行のIDを返すと、それから、サブクエリの選択に使用される必要があり、それを得ることで探しています同じ行を2回以上返すNHibernateマルチテーブルクエリ

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    .List(); 

"DataMappingBase"行IDがサブクエリによって返されたIDにありますが、それが最良の方法であるかどうかわかりません。

+0

あなたがISessionやIStatelessSessionを使用していますか? – Danielg

+0

@Danielg ISession – Seer

答えて

2

私はわからないんだけど、あなたは次のように行うことができます。

MappedID id = null; 
DataMappingBase mapBase = null; 
NameDetails name = null; 
dmbs = mappingSession.QueryOver<DataMappingBase>(() => mapBase) 
    .JoinAlias(() => mapBase.IDs,() => id).WhereRestrictionOn(() => id.SecondaryDataIDType).IsNull() 
    .JoinAlias(() => mapBase.Names,() => name).WhereRestrictionOn(() => name.Name).IsInsensitiveLike(request.Filter, MatchMode.Anywhere) 
    .Take(request.MaxResults) 
    // add this 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List(); 
+0

サブクエリを使用するよりも効率的であるかどうかお考えになりましたか?私が上で話していたサブクエリは動作しますが、頻繁に実行される他のクエリでこの問題が発生することを期待しているので、より効率的なオプション/ベストプラクティスを使いたいと考えています。 – Seer

+0

サブクエリよりも効率的にジョインするクエリは、通常は使用する方が良いと思います。 – Anton

+0

ありがとう私は今夜私のコードを更新します。迅速な詳細な答えをありがとう – Seer

関連する問題