1

QueryOverで必要なモデルのみを選択する際に少し問題が発生しました。ここに私のシナリオ

 var qOver = _HibSession.QueryOver<ModelA>(() => Ma)
                .JoinAlias(() => Ma.MbList, () => Mb, JoinType.LeftOuterJoin)
                    .Where(() => Mb.ID == _MbId)
                .JoinAlias(() => Mb.McList, () => Mc,JoinType.LeftOuterJoin)                    
                    .Where(() => Mc.ID == _McId)
                .JoinAlias(() => Mc.MdList, () => Md, JoinType.LeftOuterJoin)
                    .Where(() => Md.ID == _MdID)                                             
                .OrderByAlias(() => Ma.ID).Asc
                .Take(iTake)
                .Skip(iSkip)
                .Future<ModelA>();

前のコードは次のSQLを生成します

SELECT TOP n Ma.*,Mb.*,Mc.*,Md.*
FROM Ma 
LEFT JOIN Mb ON (...conditions...)
LEFT JOIN Mc ON (...conditions...)
LEFT JOIN Md ON (...conditions...)
WHERE Mb.ID = _MbId
AND Mc.ID = _McId
AND Md.ID = _MdId
ORDER BY Ma.ID ASC

問題は、McテーブルとMdテーブルが私の結果を複製することです。したがって、SELECTステートメントにはMaとMbのみが含まれます。

SELECT TOP n Ma.*,Mb.*
FROM
.
.
.

どうすればその結果に到達できますか?ありがとうございました!

4

3 に答える 3

2

Fetchの代わりに使用してみてくださいJoinAlias。このような何かが仕事をするはずです:

... .QueryOver<Ma>().Fetch(ma => ma.MbList).Eager

マッピングでは使用しないでください。fetch="join"

NHibernateにを使用joinさせると、テーブルのデカルト積にあるのと同じ数の行が返されます。ModelAオブジェクトごとに必要なリストアイテムは1つだけなので、NHibernateに。selectの代わりに単純なステートメントを使用させる必要がありjoinます。

于 2011-04-03T14:21:25.927 に答える
2

ルートエンティティ(ModelA)を繰り返さないようにNHibernateに通知する必要があります。これは、次のステートメントで実行できます。

.TransformUsing(Transformers.DistinctRootEntity)
于 2011-04-03T19:17:45.937 に答える
0

唯一の方法は、メインモデルとフィルター処理されたサブクエリを選択する主要なQueryOverを使用することです。

私はこのようなものを意味します

var qOverInclude = QueryOver.Of<MyModel>(() => mModel)
                .JoinAlias(() => mModel.MyList, () => mList, JoinType.LeftOuterJoin)
                    .Where(() => mList.ID == myID)
                    .And(() => mList.Type == myType)
                .Select(x => x.IdMyModel);

  var qOver = _HibSession.QueryOver<MyModel>(() => mModel)
                .JoinAlias(() => mModel.MyDescription, () => mDescription, JoinType.LeftOuterJoin)
                .Where(() => mDescription.IDLanguage == myLanguage)
                .WithSubquery.WhereProperty(() => mModel.IdMyModel).In(qOverSubQuery)
                .OrderByAlias(() => mModel.IdMyModel).Asc
                .Future<MyModel>();
于 2011-05-30T09:52:02.800 に答える