Подкачка с помощью GridView и LINQ в SQL

#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-SQL IQueryable . Вы просто не закрываете DataContext и не вызываете ToList сначала, прежде чем возвращать результаты.

Ответ №2:

В качестве альтернативы вы могли бы использовать PagedDataSource класс для достижения этой цели.

Вот статья, объясняющая, как это работает.