Как загрузить RadGrid при извлечении огромных данных из таблицы базы данных с помощью Nhibernate - PullRequest
0 голосов
/ 08 февраля 2012

Мне нравится сокращать время загрузки при запуске Default.aspx в браузере, потому что он выбирает огромные данные из таблицы в базе данных.

Когда я использую критерий. SetMaxResults (200) сетказагрузить только 200 данных, но я должен загрузить все данные в RadGrid из таблицы в базе данных. Когда я использую критерии. 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;using 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 ]

2 голосов
/ 08 февраля 2012

Показываете ли вы все данные в сетке с подкачкой?если да, вы можете создать пользовательский пейджинг для своей сетки, загрузив 10 строк для каждой введенной вами страницы, вы можете сначала получить выгружаемые данные, используя query.SetFirstResult(firstrowinpage); и query.SetMaxResults(pageSize); (HQL), и установить свойство Radgrid grid.AllowCustomPaging = true;, чтобы разрешить пользовательский пейджинг иустановите VirtualItemCount, чтобы знать, как грид, сколько строк разрешить подкачку.

grdItems.VirtualItemCount =numberofrows();   
1 голос
/ 08 февраля 2012

Если вам нужно получить данные для отображения, вы должны создать легкий объект из данных таблицы.В любом случае, если скорость извлечения является вашей единственной задачей, вы можете установить объект как 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>
1 голос
/ 08 февраля 2012

Невозможно сказать, что не так из того, что вы нам дали.Мы не знаем ваших отображений, сколько столбцов в таблице, ничего.

Проблемы могут быть вызваны следующими причинами:

  • N + 1, поскольку все ваши ассоциации стремятся
  • В вашей базе данных есть столбец с огромными данными (возможно,некоторые вложения или что-то в этом роде)

Вы также должны попытаться разбить свои результаты на страницы.

Вы должны отладить запросы NHibernate и посмотреть, что происходит.Это можно сделать либо с помощью show_sql, либо с помощью какого-либо средства ведения журнала, либо с помощью какого-либо профилировщика, например NHProf, или даже профилировщика SQL.

Вероятно, вы увидите много выполненных запросов, поскольку не включена отложенная загрузка.

РЕДАКТИРОВАТЬ:

Если у вас есть несколько столбцов в таблице, которые вы не хотите загружать, если вы не обращаетесь к ним, вы можете установить сопоставление их свойств с помощью lazy = true,или вы можете сопоставить эти столбцы с компонентами и установить эти компоненты как lazy = true.Таким образом, при первом обращении к этим столбцам будут выполняться дополнительные запросы.

...