我在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
.
.
.
我如何达到这个结果? 谢谢!
答案 0 :(得分:2)
尝试使用Fetch
代替JoinAlias
。这样的事情应该可以胜任:
... .QueryOver<Ma>().Fetch(ma => ma.MbList).Eager
并且不在您的映射中使用fetch="join"
。
当你强制NHibernate使用join
时,它将返回与表格的笛卡尔积中的行数一样多的行。由于每个ModelA对象只需要一个列表项,因此您必须让NHibernate使用简单的select
语句而不是join
。
答案 1 :(得分:2)
您需要通知NHibernate不要重复根实体(ModelA)。您可以使用以下语句执行此操作:
.TransformUsing(Transformers.DistinctRootEntity)
答案 2 :(得分:0)
似乎唯一的方法是使用主要的QueryOver选择主模型和过滤的SubQuery
我的意思是这样的
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>();