为什么NHibernate会提取超出需要的数据?

时间:2013-11-21 20:22:38

标签: nhibernate fluent-nhibernate

我正在使用NHibernate运行以下查询:

var query = session.QueryOver<TaskMeeting>()
    .JoinQueryOver(x => x.Task)
    .Where(x => x.CloseOn == null)
    .List();

然后生成以下SQL:

SELECT
    this_.Id as Id89_1_,
    this_.TaskMeetingTypeID as TaskMeet2_89_1_,
    this_.DateTime as DateTime89_1_,
    this_.Description as Descript4_89_1_,
    this_.TaskID as TaskID89_1_,
    ltaskalias1_.Id as Id87_0_,
    ltaskalias1_.Title as Title87_0_,
    ltaskalias1_.Description as Descript7_87_0_,
    ltaskalias1_.CreatedOn as CreatedOn87_0_,
    ltaskalias1_.LastUpdated as LastUpda9_87_0_,
    ltaskalias1_.ClosedOn as ClosedOn87_0_,
FROM
    dbo.[TaskMeeting] this_ 
inner join
    dbo.[Task] ltaskalias1_ 
        on this_.TaskID=ltaskalias1_.Id 
WHERE
    ltaskalias1_.ClosedOn is null 

是否正在拉动连接表信息的正常行为?我认为它应该只选择与根实体有关的数据,除非我指定.Fetch子句或手动选择数据。

我正在使用Fluent NHibernate作为类映射,但它们是类似这样的基本映射,没有指定急切加载 - 只需要简单的MapReferences

我已经尝试删除where子句,也许这就是原因。除非我删除连接本身,否则额外的SELECT会继续存在。

2 个答案:

答案 0 :(得分:1)

您查询数据的方式,您将获得一个通用的IList&lt;&gt;包含TaskMeeting实体。因此,NHibernate查询TaskMeeting表的所有列以将该数据放入TaskMeeting实体属性是正常的。但我想这已经知道了。

但是因为你想通过另一个表限制数据,你必须加入它。这是数据库服务器的昂贵部分。查询那些额外的列是花生与它相比,NHibernate也可以使用数据来填充TaskMeeting实体中的任务引用。

至少我是这样理解的。

答案 1 :(得分:0)

快速回答是你告诉它的。你调用了JoinQueryOver,它将在任务上创建一个连接查询。

获得您想要的更简单的方法是创建一个linq查询并仅将您想要的字段投影为匿名类型。这将生成一个只包含匿名类型声明的列的查询。

var meetings = 来自m in session.Query() 其中m.Task.ClosedOn&lt;&gt;空值 选择新的{somefield = m.Task.Name,...};