#c# #linq #linq-to-sql #gridview #pagination
#c# #linq #linq-to-sql #просмотр сетки #разбивка на страницы
Вопрос:
Мой grideview:
<asp:GridView runat="server" ID="MyGridView" AutoGenerateColumns="false"
DataKeyNames="ID"
OnRowCreated="MyGridView_RowCreated" AllowPaging="true" Width="100%"
PageSize="5" onpageindexchanging="MyGridView_PageIndexChanging" >
Мой код, лежащий в основе page_load:
MyGridView.DataSource = new Emp.GetData();
MyGridView.DataBind();
Мой код:
using (DataContext db = new DataContext())
{
var query = //valid query here
query = query.Skip(StartRowIndex *5 ).Take(5);
return query.ToList();
}
если у меня в базе данных 15 записей, при загрузке страницы я вижу ссылки на страницу 1,2 и 3 с данными для страницы 1, показанными — 5 записей. затем, когда я перехожу на страницу 2 с 5 записями, я вижу ссылки на страницы 1 и 3. когда я перехожу на страницу 3, я вижу только 2 записи вместо 5, и иногда ссылка подкачки также отображается некорректно.
Я хочу отображать 5 записей на страницу и хочу, чтобы GridView определял, сколько страниц отображать.
я не использую LinqDataSource, просто у меня есть метод, который возвращает список.
Комментарии:
1. Какого рода LINQ? LINQ в XML?
2. Если бы я использовал linqdatasource, у меня был бы maxrecords, и это каким-то образом управляло подкачкой. с помощью gridview в большинстве случаев я не получаю ссылки для подкачки. если я установлю значение take (maxrowcount), то это иногда срабатывает…
Ответ №1:
На самом деле это, как правило, проще, если вы используете LinqDataSource
.
<asp:LinqDataSource ID="MyDataSource" runat="server"
OnSelecting="MyDataSource_Selecting">
</asp:LinqDataSource>
И в коде, лежащем в основе, вы можете просто перенаправить LinqDataSource
для вызова вашего уровня бизнес-логики. Однако теперь нужно будет оставить DataContext
объект открытым, т. Е. не заключать его в using
блок, иначе вы получите сообщение об ошибке (а также не применяйте подкачку вручную с помощью Skip(..).Take(..)
.
protected void MyDataSource_Selecting(object sender,
LinqDataSourceSelectEventArgs e) {
e.Result = Emp.GetData();
}
Теперь LinqDataSource
должен автоматически управлять всей подкачкой для вас.
Комментарии:
1. Проблема с этим подходом заключается в том, что вы загружаете все данные. Если имеется 10000 записей, вы бы загружали их все, чтобы получить 5 из них. Skip() и Take() генерируют соответствующий SQL-код, чтобы из базы данных возвращалось только то, что необходимо
2. Нет,
LinqDataSource
так не работает с включенной подкачкой. Он достаточно умен, чтобы захватывать нужные ему записи только тогда, когда вы предоставляете ему объект LINQ-to-SQLIQueryable
. Вы просто не закрываетеDataContext
и не вызываетеToList
сначала, прежде чем возвращать результаты.
Ответ №2:
В качестве альтернативы вы могли бы использовать PagedDataSource
класс для достижения этой цели.
Вот статья, объясняющая, как это работает.