如何使用Nhibernate从数据库表中获取大量数据时加载RadGrid

时间:2012-02-08 09:32:07

标签: nhibernate radgrid icriteria

我喜欢在浏览器中运行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; }

   }
}

3 个答案:

答案 0 :(得分:2)

您是否使用分页显示网格中的所有数据?如果是,您可以为您输入的每个页面加载10行,为您的网格创建自定义分页,您可以先使用query.SetFirstResult(firstrowinpage);query.SetMaxResults(pageSize);(HQL)检索分页数据 ,并设置Radgrid属性grid.AllowCustomPaging = true;以允许自定义分页,并设置VirtualItemCount以了解网格允许分页的行数。

grdItems.VirtualItemCount =numberofrows();   

答案 1 :(得分:1)

不可能从你给我们的东西中辨别出什么是错的。我们不知道您的映射,表中有多少列,没有。

问题可能由以下原因引起:

  • N + 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>