c# asp.net linq sorting gridview

c# - La fuente de datos no es compatible con la paginación de datos del lado del servidor



asp.net linq (7)

Tengo un GridView en mi pantalla y lo necesito para permitir la paginación.

Margen:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="ObjectDataSource1"> <Columns> <asp:BoundField DataField="appID" HeaderText="appID" SortExpression="appID" /> </Columns> </asp:GridView> <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetBookingId" TypeName="AppointmentRepository"> <SelectParameters> <asp:Parameter Name="maximumRows" Type="Int32" /> <asp:Parameter Name="startRowIndex" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource>

Código detrás:

ObjectDataSource1.SelectParameters["maximumRows"].DefaultValue = "10"; ObjectDataSource1.SelectParameters["startRowIndex"].DefaultValue = "0";

Consulta LINQ:

public IQueryable<tblAppointment> GetBookingId(int maximumRows, int startRowIndex) { var result = (FROM a IN dc.tblAppointments SELECT a).Skip(startRowIndex).Take(maximumRows); }

Sin embargo recibo este error:

La fuente de datos no es compatible con la paginación de datos del lado del servidor.

¿Qué estoy haciendo mal?


Cambié mi código a esto:

public List<string> ListofNewsTitle() { var query = from n in db.NewsEvents orderby n.NewsDate descending select n.NewsTitle; return query.ToList(); }


Consulta LINQ:

ProductController.cs:

List<Product> products= productModel.GetProducts(start, offset);

ProductModel.cs:

public List<Product> GetProducts(int start, int offset) { IEnumerable<Product> query = from m in db.Products orderby m.Id descending select m; query = query.Skip(start).Take(offset); return query.ToList(); }


En ObjectDataSource simplemente agregue enablePaging="true" que funcionará.


Si está utilizando SqldataReader, entonces no es compatible con Paginación.

La solución a este error está haciendo uso de DataSources, como las colecciones de la Lista genérica, DataTables, DataSets, etc., para vincular GridView.


También puede usar la List<T> genérica List<T> . Ver el fragmento de código de muestra:

public List<Company> GetContactList(int startindex) { string path = Server.MapPath("~/contacts.xml"); XDocument xd = XDocument.Load(path); IEnumerable<Company> results = (from items in xd.Elements("Company").Elements("Contact") select new Company { Id = items.Element("ID").Value, Photo = (string)items.Element("photo").Value, Name = (string)items.Element("Name").Value, BloodGroup = (string)items.Element("Bg").Value, Dob = (string)items.Element("dob").Value, Anniversery = (string)items.Element("avd").Value, Mobile = (string)items.Element("cnum").Value, designation = (string)items.Element("desig").Value, Team = (string)items.Element("team").Value }).Skip(startindex*10).Take(10); return (List<Company>) results; }

También puede usar DataSet / DataTable en lugar de DataReader.


Un simple ToList() en su resultado var debería funcionar.

Editar : como BornToCode explicado en los comentarios debajo de mi respuesta, la razón del error es que la fuente de datos debe implementar ICollection. IEnumerable no lo hace, cuando lo hace ToList() lo convierte en una lista que implementa ICollection.


.ToList() al final de DataSource, estoy asignando trabajo para mí como a continuación:

gvCaseLabelsLeft.DataSource = caseLabelsList.OrderBy(c=>c.caseLabelNumber).ToList();