我正在使用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
作为类映射,但它们是类似这样的基本映射,没有指定急切加载 - 只需要简单的Map
和References
。
我已经尝试删除where子句,也许这就是原因。除非我删除连接本身,否则额外的SELECT
会继续存在。
答案 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,...};