1

私は、古典的な状況Orders/OrderLinesを持っています。 私はいくつかの注文を取っていきたいと思って、外側の結合で注文ラインを熱心に読み込みました。 私がQueryOver使用する場合ことに気づいた:複数のコレクションを熱心に取り出す:QueryOverとクエリの違い

var orders2 = session.QueryOver<Domain.Order>() 
    .Where(x => x.Company == "HBP00").And(x => x.Number == "VI11001680") 
    .Fetch(x => x.OrderLines).Eager 
    .List(); 

を私はデカルト積を取得します。
orders2には1つの注文があっても11行が含まれていますが、実際には11の注文線があります。
私は、クエリを使用する場合:

var orders1 = session.Query<Domain.Order>() 
    .Where(x => x.Company == "HBP00" && x.Number == "VI11001680") 
    .Fetch(x => x.OrderLines) 
    .ToList(); 

すべてが正常に動作します。 面白いことに、私はクエリを分析しており、それらは同じです。 Cartesian製品でQueryOverを使ってコレクションを積極的に読み込めないことを知りたいことはありますか?

ありがとうございます。

答えて

3

解決策を見つけました。this blogです。

明らかに、CreateQuery、CreateCriteria、またはQueryOverで.TransformUsing(Transformers.DistinctRootEntity)が必要ですが、クエリでは不要です。ここで

は、私はそれを固定方法は次のとおりです。

var orders2 = session.QueryOver<Domain.Order>() 
    .Where(x => x.Company == "HBP00").And(x => x.Number == "VI11001680") 
    .Fetch(x => x.OrderLines).Eager 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List();