2012-02-08 4 views
0

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

Когда я использую критерии.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.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; } 

    } 
} 

ответ

1

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

grdItems.VirtualItemCount =numberofrows(); 
+0

Спасибо за ответ, попробуем это тоже – Philip

1

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

Проблемы могут быть вызваны либо:

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

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

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

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

EDIT:

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

+0

У меня нет никакого отображения в таблице, это только одна таблица с около 20 столбцов с огромным data.Please вы можете предложить мне любое кодирование, чтобы уменьшить время загрузки – Philip

+0

Проверьте редактирование ... –

+0

Что такое EDIT: пожалуйста, помогите мне – Philip

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(); 

Mapping -

<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> 
+0

Я не могу получить доступ к crit.SetCacheMode (CacheMode.ReadOnly), где свойство Readonly не приходит – Philip

+0

Извините, в коде CacheMode.Get. И ваш hbm правильный. –

+0

Я не могу получить объемные данные, которые я сделал в соответствии с вашей инструкцией, пожалуйста, поправьте меня – Philip

 Смежные вопросы

  • Нет связанных вопросов^_^