Я озадачен этой проблемой производительности. При поиске по RadGrid я получаю мгновенные результаты. Однако, когда я фильтрую любой из столбцов, выполнение запроса занимает около 10 секунд, и любая подкачка, применяемая после фильтра, остается такой же медленной. Если я уберу фильтр, производительность будет просто отличной.
Production - это сервер SharePoint 2010, который размещен внутри компании с небольшим количеством пользователей. Я использую элемент управления RadGrid версии 2009.3..1314.35, который запрашивает таблицу, содержащую 30 000 записей. Я использую LINQ to SQL для серверной части. Я использовал IE и Firefox в производстве. На моей машине для разработки проблем с производительностью нет.
Запрос не сложный, источник записей не очень большой, а трафик низкий, поэтому я не уверен, как отследить проблему. Вот некоторые мысли, которые у меня есть:
- Что-то не так с моим запросом LINQ.
- Неправильное использование или неправильное понимание RadGrid.
- База данных не оптимизирована? Я преобразовал его из Access в SQL Server 2008.
- Проблема с сетью?
Ниже мой код. Любая помощь будет оценена.
ASPX:
<telerik:GridTemplateColumn AllowFiltering="false" SortExpression="Marked" HeaderText="Marked" UniqueName="Marked">
<ItemTemplate>
<asp:CheckBox
ID="chkbxMarked" runat="server"
OnCheckedChanged="ToggleRowSelection"
Checked='<%# Eval("Marked") %>'
AutoPostBack="True" />
</ItemTemplate>
</telerik:GridTemplateColumn>
<telerik:GridBoundColumn DataField="NamePrefix" SortExpression="NamePrefix" AllowFiltering="false" HeaderText="Name Prefix" />
<telerik:GridBoundColumn DataField="LastName" SortExpression="LastName" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Last Name" />
<telerik:GridBoundColumn DataField="FirstName" SortExpression="FirstName" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="First Name" />
<telerik:GridBoundColumn DataField="MiddleName" SortExpression="MiddleName" AllowFiltering="false" HeaderText="Middle Name" />
<telerik:GridBoundColumn DataField="Phone1" SortExpression="Phone1" AllowFiltering="false" HeaderText="Phone" />
<telerik:GridBoundColumn DataField="Phone1Ext" SortExpression="Phone1Ext" AllowFiltering="false" HeaderText="Ext." />
<telerik:GridBoundColumn DataField="Email1" SortExpression="Email1" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Email" />
<telerik:GridBoundColumn DataField="Profile" SortExpression="Profile" AutoPostBackOnFilter="true" CurrentFilterFunction="Contains" HeaderText="Profile" />
</Columns>
</MasterTableView>
BLL:
public IList<Person> FindAllByProfile(string profileName, int rowStart, int numRows)
{
return profileName == "All" ? _repos.FindAll(rowStart, numRows) : _repos.FindAllByProfile(profileName, rowStart, numRows);
}
public int FindAllByProfileCount(string profileName)
{
return profileName == "All" ? _repos.FindAllCount() : _repos.FindAllByProfileCount(profileName);
}
Repository:
public IList<Person> FindAll(int rowStart, int numRows)
{
using (PRADbDataContext db = new PRADbDataContext())
{
var data = from p in db.persons
join c in db.contacts on p.PersKey equals c.PersKey into personContacts
from pc in personContacts.DefaultIfEmpty()
orderby p.Modified descending
select new Person()
{
Id = p.PersKey,
AddressId = p.AddrKey,
DateModified = p.Modified,
Email1 = p.EMail1,
Marked = p.Marked,
Phone1 = p.Phone1,
Phone1Ext = p.PhExt1,
NamePrefix = p.MrMs,
FirstName = p.FName,
LastName = p.LName,
MiddleName = p.MName,
Title = p.Title,
Profile = pc.ProfKey ?? "N/A"
};
return data.Skip(rowStart).Take(numRows).ToList();
}
}
public int FindAllCount()
{
using (PRADbDataContext db = new PRADbDataContext())
{
var data = from p in db.persons
join c in db.contacts on p.PersKey equals c.PersKey
select new Person()
{
Id = p.PersKey,
};
return data.Count();
}
}