2010-12-07 26 views
2

Cette séquence que j'ai créé fonctionne bien dans LINQPadPourquoi cette séquence d'entités ne triera-t-elle pas dans GridView après la liaison?

IQueryable<AccessRequest> filteredRows1; 
// retrieve the last record of each request in its request history 
filteredRows1 = from req in AccessRequestSet 
    group req by req.TaskReferenceId 
    into g 
    let topReq = g.OrderByDescending(r => r.UpdateDate).FirstOrDefault() 
    select topReq; 

IQueryable<AccessRequest> filteredRows = 
    filteredRows1.Where(o => o.Status == "Requested"); 

Je veux trier les entités en question par le terrain, RequestedReleaseTime.

filteredRows.OrderBy(p => p.RequestedReleaseTime); 

Encore une fois, je suis un regroupement par DateTime avec succès, puis le tri par un autre DateTime avec succès, confirmé dans LINQPad. Je puis ajouter cela comme une source de données et se lient à mon GridView:

gvRequests.DataSourceID = string.Empty; 
      gvRequests.DataSource = filteredRows; 
      gvRequests.DataBind(); 

J'ai même mis AllowSorting = « true » et a ajouté cette ligne à trier.

gvRequests.Sort("RequestedReleaseTime", SortDirection.Ascending); 

J'ai essayé cette dernière ligne avant et après le DataBind en vain. Quel est le problème avec cette approche? Dois-je faire tout cela dans les événements OnSorted ou OnSorting? Note: J'ai essayé cela et j'ai obtenu StackOverflowException, ce qui m'a rappelé que je devrais vous demander les gars. Merci à des millions pour toute direction ou aide que je reçois.

Répondre

1

Appel OrderBy ne modifie pas réellement la requête initiale, mais retourne à la place une nouvelle requête basée sur l'original, que vous devez ramasser:

var filteredRowsOrdered = filteredRows.OrderBy(p => p.RequestedReleaseTime); 

Je crois « le sort » du gridview est destiné à Travailler avec quelque chose comme un ObjectDataSource, qui sait appeler une méthode pour récupérer les données et passer une chaîne de tri dans cette méthode. Malheureusement, cela ne fonctionne pas très bien avec Entity Framework. Nous avons trouvé quelques astuces pour que nos classes d'accès aux données comprennent comment convertir une expression de tri en une instruction q = q.OrderBy(...). Mais ça peut être compliqué.

+0

Bon point, comme les cordes, ils sont immuables. J'utilise en fait la requête modifiée dans mon application. Le code ci-dessus vient de ce que j'ai fait dans LINQPad pour le tester. J'espérais qu'il y avait une solution évidente. – Blanthor

+0

@Blanthor: Si vous définissez la source de données sur la requête ordonnée (ce que dans mon exemple est filteredRowOrdered dans mon exemple), elle doit être correctement configurée. – StriplingWarrior