我喜欢在浏览器中运行Default.aspx时减少加载时间,因为它从数据库中的表中获取大量数据。
当我使用criteria.SetMaxResults(200)时,网格只加载200个数据,但我应该从数据库中的表中加载RadGrid中的所有数据。当我使用criteria.SetFetchSize(200)时,它也需要很长的时间加载任何人都可以帮我找到解决方案。
这是代码
ICriteria criteria = session.CreateCriteria(typeof(Ttable1));
criteria.SetMaxResults(200);
IList result = criteria.List();
if (result.Count > 0)
{
grid1.DataSource = result;
grid1.DataBind();
}
else
{
grid1.DataSource = new string[] { };
grid1.DataBind();
}
这里的映射是
<class name="Ttable1" table="Ttable1" lazy="false" mutable="true">
<cache usage="read-only"/>
<id name="ID" column="ID" >
</id>
<property name="CustNumber" column="CustNumber" type="String" />
<property name="CustName" column="CustName" type="String"/>
<property name="PNo" column="PNor" type="String"/>
<property name="ONo" column="ONo" type="String"/>
<property name="Ln" column="Lns" type="String"/>
<property name="Comments" column="Comments" type="String"/>
<property name="size" column="size" type="String"/>
<property name="Qty" column="Qty" type="String"/>
</class>
</hibernate-mapping>
这是班级 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Text;
namespace Business.entities
{
public class Ttable1
{
public virtual string displayobj { get; set; }
public virtual Ttable1 TLQDataObj { get; set; }
public virtual int? ID { get; set; }
public virtual string CustNumber { get; set; }
public virtual string CustName { get; set; }
public virtual string PNo { get; set; }
public virtual string ONo { get; set; }
public virtual string Ln { get; set; }
public virtual string Comments { get; set; }
public virtual string size { get; set; }
public virtual string Qty { get; set; }
}
}
答案 0 :(得分:2)
您是否使用分页显示网格中的所有数据?如果是,您可以为您输入的每个页面加载10行,为您的网格创建自定义分页,您可以先使用query.SetFirstResult(firstrowinpage);
和query.SetMaxResults(pageSize);
(HQL)检索分页数据
,并设置Radgrid属性grid.AllowCustomPaging = true;
以允许自定义分页,并设置VirtualItemCount以了解网格允许分页的行数。
grdItems.VirtualItemCount =numberofrows();
答案 1 :(得分:1)
不可能从你给我们的东西中辨别出什么是错的。我们不知道您的映射,表中有多少列,没有。
问题可能由以下原因引起:
您还应尝试对结果进行分页。
您必须调试NHibernate查询并查看发生了什么。您可以使用show_sql,使用某些记录器或使用某些分析器(如NHProf,甚至SQL分析器)来执行此操作。
您可能会看到许多查询已执行,因为没有启用延迟加载。
编辑:
如果您在表中有一些列不想加载,除非您访问它们,您可以使用lazy = true设置它们的属性映射,或者您可以使用组件映射这些列并将这些组件设置为lazy =真正。这样,当您第一次访问这些列时,将执行其他查询。
答案 2 :(得分:1)
如果您需要获取数据用于显示目的,您应该从表数据中创建一个灯光对象。
在任何情况下,如果您只关注提取速度,则可以将对象设置为mutable=false
并设置缓存<cache usage="read-only"/>
。
您也可以在代码中执行此操作:
ICriteria crit = session.CreateCriteria(typeof(Ttable1));
crit.SetCacheable(true);
crit.SetCacheMode(CacheMode.Get);
crit.SetMaxResults(200);
IList result = crit.List();
映射 -
<class name="Ttable1" table="Ttable1" lazy="false" mutable="false">
<cache usage="read-only"/>
<id name="ID">
<column name="ID"/>
<generator class="identity"/>
</id>
<property name="CustNumber" column="CustNumber" type="String" />
<property name="CustName" column="CustName" type="String"/>
<property name="PNo" column="PNor" type="String"/>
<property name="ONo" column="ONo" type="String"/>
<property name="Ln" column="Lns" type="String"/>
<property name="Comments" column="Comments" type="String"/>
<property name="size" column="size" type="String"/>
<property name="Qty" column="Qty" type="String"/>
</class>