Linq2sql / GridView: La pagination ne fonctionne pas?

Quelle est la meilleure méthode pour lier une collection linq2sql à un GridView, étant donné que je veux utiliser une pagination et un sorting embeddeds?

J'ai essayé:

public static void BindEnquiryList(EnquiryQuery query, GridView view) { DataContext db = DataContextManager.Context //view.DataSource = (from e in EnquiryMethods.BuildQuery(query) view.DataSource = (from e in db.Enquiries select new { Id = e.Id, Name = e.Name, PublicId = EnquiryMethods.GetPublicId(e.PublicId), What = e.WorkType.DescriptionText, Where = e.EnquiryArea.DescriptionText, Who = e.EnquiryType0.DescriptionText, When = e.EnquiryTime0.DescriptionText, PriceRange = e.EnquiryPrice0.DescriptionText, DisplayPriceRange = e.EnquiryPrice0.Display, Description = e.Description, Published = e.EnquiryPublished }); view.DataBind(); } 

Et le GridView est mis à 20 pages (et affiche correctement 20), mais l'exécution prend une éternité à charger et quand je connecte le SQL, je reçois:

 SELECT [t0].[Id], [t0].[Name], [t0].[PublicId] AS [publicId], [t1].[DescriptionText] AS [What], [t2].[DescriptionText] AS [Where], [t3].[DescriptionText] AS [Who], [t4].[DescriptionText] AS [When], [t5].[DescriptionText] AS [PriceRange], [t5].[Display] AS [DisplayPriceRange], [t0].[Description], [t0].[EnquiryPublished] AS [Published] FROM [dbo].[Enquirys] AS [t0] LEFT OUTER JOIN [dbo].[WorkTypes] AS [t1] ON [t1].[Id] = [t0].[EnquiryPlace] LEFT OUTER JOIN [dbo].[EnquiryAreas] AS [t2] ON [t2].[Id] = [t0].[EnquiryPlace] LEFT OUTER JOIN [dbo].[EnquiryTypes] AS [t3] ON [t3].[Id] = [t0].[EnquiryType] LEFT OUTER JOIN [dbo].[EnquiryTimes] AS [t4] ON [t4].[Id] = [t0].[EnquiryTime] LEFT OUTER JOIN [dbo].[EnquiryPrices] AS [t5] ON [t5].[Id] = [t0].[EnquiryPrice] -- Context: SqlProvider(Sql2005) Model: AtsortingbutedMetaModel Build: 3.5.21022.8 

Sans top. Je m'attendais à ce que GridView gère les opérations Take et Skip?

Le meilleur moyen est d'utiliser LinqDataSource. Créez un gestionnaire d'events pour l'événement de sélection sur LinqDataSource.

 protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e) { e.Result = (from e in db.Enquiries select new { Id = e.Id, Name = e.Name, PublicId = EnquiryMethods.GetPublicId(e.PublicId), What = e.WorkType.DescriptionText, Where = e.EnquiryArea.DescriptionText, Who = e.EnquiryType0.DescriptionText, When = e.EnquiryTime0.DescriptionText, PriceRange = e.EnquiryPrice0.DescriptionText, DisplayPriceRange = e.EnquiryPrice0.Display, Description = e.Description, Published = e.EnquiryPublished }); } 

Ensuite, LinqDataSource gérera la pagination et le sorting pour vous et vous obtiendrez des vérifications de compilation sur votre requête linq

Je ne suis pas sûr, mais pouvez-vous utiliser un LinqDataSource? Sinon, je pense que GridView exige que datatables soient dans un DataSet pour qu'il puisse faire le paging et le sorting lui-même.

IEnumerable <T> n'est pas pris en charge pour le sorting et la pagination par le contrôle GridView. Mais vous pouvez toujours utiliser une list <T>. Juste .ToList () votre jeu de résultats.

 grid_PageIndexChanging(object sender, GridViewPageEventArgs e) { this.grid.PageIndex = e.NewPageIndex; this.grid.DataSource = this.DataSource; this.grid.DataBind(); }