Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Castle ActiveRecord/NHibernate优化_Nhibernate_Castle Activerecord - Fatal编程技术网

Castle ActiveRecord/NHibernate优化

Castle ActiveRecord/NHibernate优化,nhibernate,castle-activerecord,Nhibernate,Castle Activerecord,我有以下结构:消息消息表可能有多个字段表,每个字段可能有多个子字段存储在同一个字段表中,唯一的区别是字段在ParentField列中没有值。子字段可能有子字段等,但这并不重要 当我检索到10条消息,每条消息有10个字段,每个字段有20个子字段时,我可以从日志文件中看到NHibernate生成2000个SQL调用。 有没有办法优化它 谢谢 以下是NHibernate生成的2000条SQL语句之一: 选择FieldResult0。MessageResults\u ID作为MessageR6\uuuu

我有以下结构:消息消息表可能有多个字段表,每个字段可能有多个子字段存储在同一个字段表中,唯一的区别是字段在ParentField列中没有值。子字段可能有子字段等,但这并不重要

当我检索到10条消息,每条消息有10个字段,每个字段有20个子字段时,我可以从日志文件中看到NHibernate生成2000个SQL调用。 有没有办法优化它

谢谢

以下是NHibernate生成的2000条SQL语句之一:

选择FieldResult0。MessageResults\u ID作为MessageR6\uuuuuuu2\u2, FieldResult0.ID作为ID2, FieldResult0.ID作为ID5\u 1\u, FieldResult0。字段ID为Field2\u 5\u 1\u, FieldResult0\名称为Name5\u 1\u, FieldResult0.值作为值5\u 1\u, FieldResult0.MessagePosition为MessageP5\U 5\U 1, FieldResult0.MessageResults\u ID为MessageR6\u 5\u 1\u, FieldResult0\u.ParentField\u ID作为ParentFi7\u 5\u 1\u, FieldResult1.ID为ID5\u 0\u, FieldResult1.字段ID为Field2\u 5\u 0\u, FieldResult1。名称为Name5\u 0\u, FieldResult1.值作为值5\u 0\u, FieldResult1.MessagePosition为MessageP5\U 5\U 0\, FieldResult1.MessageResults\u ID为MessageR6\u 5\u 0, FieldResult1\u.ParentField\u ID作为ParentFi7\u 5\u 0\u 来自FieldResults FieldResult0\u 左外部联接字段结果字段结果1\u 在FieldResult0.ParentField\u ID=FieldResult1.ID上 其中fieldresult0.MessageResults\u ID=@p0 按字段排序结果0\u0.MessagePosition 下面是ActiveRecord生成的映射文件:

<?xml version="1.0" encoding="utf-16"?> 
    <hibernate-mapping  auto-import="true" default-lazy="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:nhibernate-mapping-2.2">  
      <class name="FieldResult, Data" table="FieldResults"> 
        <id name="ID" access="property" column="ID" type="Int32" unsaved-value="0"> 
          <generator class="native">    
            <param name="sequence">FieldResults_ID</param>  
          </generator>  
        </id>   
        <property name="FieldID" access="property" type="String">   
          <column name="Field_ID"/> 
        </property> 
        <property name="Name" access="property" type="String">  
          <column name="Name"/> 
        </property> 
        <property name="DisplayValue" access="property" type="String">  
          <column name="Value"/>    
        </property> 
        <property name="MessagePosition" access="property" type="Int32">    
          <column name="MessagePosition"/>  
        </property> 
        <many-to-one name="ParentMessage" access="property" class="MessageResult, Data" column="MessageResults_ID" />   
        <many-to-one name="ParentField" access="property" class="FieldResult, Data" column="ParentField_ID" />  
        <bag name="Children" access="property" table="FieldResults" lazy="false" cascade="all" order-by="Field_ID"> 
          <key column="ParentField_ID" />   
          <one-to-many class="FieldResult, Data" /> 
        </bag>  
      </class>  
    </hibernate-mapping>`   

我猜这是一个精选的n+1问题。您是否尝试过快速加载或自定义HQL查询?如果您还没有找到一种方法来帮助nhibernate执行一些更有效的连接,我将发布一些HQL示例来解决这个问题。显式地告诉查询处理器使用联接获取包含查找表,并通过HQL和Session.CreateQuery获取结果

from FieldRestults fr 
left join fetch fr.ParentMessage 
left join fetch fr.ParentField
优化我目前正在调查的另一个问题中的包