Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么NHibernate获取的数据比需要的多?_Nhibernate_Fluent Nhibernate - Fatal编程技术网

为什么NHibernate获取的数据比需要的多?

为什么NHibernate获取的数据比需要的多?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在使用NHibernate运行以下查询: var query = session.QueryOver<TaskMeeting>() .JoinQueryOver(x => x.Task) .Where(x => x.CloseOn == null) .List(); 拉取联接表信息是正常行为吗?我认为它应该只选择与根实体相关的数据,除非我指定.Fetch子句或手动选择数据 我正在使用Fluent NHibernate进行类映射,但它们是类似这

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

var query = session.QueryOver<TaskMeeting>()
    .JoinQueryOver(x => x.Task)
    .Where(x => x.CloseOn == null)
    .List();
拉取联接表信息是正常行为吗?我认为它应该只选择与根实体相关的数据,除非我指定
.Fetch
子句或手动选择数据

我正在使用
Fluent NHibernate
进行类映射,但它们是类似这样的基本映射,没有指定快速加载-只要简单
Map
引用即可


我试着删除where子句,认为这可能是原因。除非我删除联接本身,否则附加的
SELECT
s将继续存在。

快速答案是您告诉它。您调用了JoinQueryOver,它将对任务创建一个联接查询

仅获取所需内容的更简单方法是创建linq查询,并仅将所需字段投影到am匿名类型中。这将生成一个只包含匿名类型中声明的列的查询

风险值会议= 来自会话中的m.Query() 其中m.Task.ClosedOn为null
选择新建{somefield=m.Task.Name,…}

按照查询数据的方式,您将返回一个包含TaskMeeting实体的通用IList。因此,NHibernate查询TaskMeeting表的所有列以将数据放入TaskMeeting实体属性是正常的。但我想这已经是众所周知的了

但是,由于要通过另一个表限制数据,因此必须对其进行联接。这是数据库服务器的昂贵部分。查询这几个额外的列与之相比是微不足道的,NHibernate还可以使用这些数据填充TaskMeeting实体中的任务引用


至少我是这样理解的

但是,延迟加载引用实体的意义不在于它们是延迟加载的。在这种特殊情况下,任务很可能已经加载到辅助缓存中,将其拉过来只会增加必须通过网络拉过来的数据量。不是真的。对于尚未加载的引用,会发生延迟加载。如果您通过“var taskmeting=session.Get(1)”获得TaskMeeting,然后访问taskmeting.Task.Description,则您将从DB(或第二层lvl缓存)延迟加载TaskMeeting实体引用的任务实体。如果您刚刚使用了“sesseion.QueryOver().List()”,则相同。但是,按照您查询TaskMeeting并通过join限制结果的方式,NHibernate已经拥有查询中填充TaskMeeting+任务实体所需的所有数据。NHibernate始终拥有查询TaskMeeting+任务实体所需的所有数据,因为在您配置它时,它具有类映射信息;这并不意味着它总是提取数据。你误读了我的句子。让我们重新措辞。您所做查询的结果中已包含nhibernate用于填充TaskMeeting和关联任务实体的数据。由于您在查询中加入了任务实体,数据库的繁重工作(从TaskMeeting到Task的连接)已经完成,因此可能需要选择Task表的列并填充Task实体。正如您所说,数据已经因为该连接而被提取。
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