c# - NHibernate QueryOver 选择只需要的模型

标签 c# nhibernate queryover

我在 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
.
.
.

我怎样才能达到那个结果? 谢谢!

最佳答案

尝试使用 Fetch 而不是 JoinAlias。像这样的东西应该可以完成这项工作:

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

并且在您的映射中使用fetch="join"

当您强制 NHibernate 使用 join 时,它将返回与您的表的笛卡尔积中一样多的行。由于每个 ModelA 对象只需要一个列表项,因此您必须让 NHibernate 使用简单的 select 语句而不是 join

关于c# - NHibernate QueryOver 选择只需要的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5528895/

相关文章:

c# - 坐标轴的合适类型?

c# - 使用被忽略的属性的 QueryOver

c# - 如何使用 QueryOver 返回通用列表

c# - 使用 AutoMapper 将 IList<TSource> 映射到 (Iesi.Collections.Generic) ISet<TDestination>

c# - NHibernate.Mapping.ByCode.Conformist.ClassMapping 和 FluentNHibernate.Mapping.ClassMap 有什么区别?

c# - 使用 nhibernate 有什么方法可以在接口(interface)中映射只读属性

NHibernate 使用 Linq 或 QueryOver 将子实体投影到父属性中

c# - 对音频使用低通滤波器

c# - 嵌套 "from"用扩展方法表示的 LINQ 查询

c# - 默认构造函数是必需的吗?