2012-07-17 3 views
1

J'ai un GridView, avec filtrage et pagination (10 à la fois), lié à une Linqdatasource. Tout cela fonctionne. Mais comment puis-je obtenir l'ID de toutes les données récupérées dans le LinqDataSource après la fin de la récupération de toutes les lignes?Itérer sur des objets retournés par Linqdatasource

J'ai cette méthode, et e.Result est un type de données objet contenant une liste pour cette grille

protected void LinqDataSource_Selected(object sender, LinqDataSourceStatusEventArgs e) // event fires after data retrieval complete. 
{ 
    List<int> ids = new List<int>(); 
    if (e.TotalRowCount > 0) 
    { 
     for (int idx = 0; idx < e.TotalRowCount; idx++) 
     { 
      Foo foo = (Foo)(e.Result[idx]); // error cannot apply indexing to expression of type object 
      ids.Add(foo.Id); 
     } 
    } 
} 

Mon erreur est itérez un objet, comment cela peut-il être fait?

+0

quel genre de liste ne contient e.Result? si e.Result est un objet, vous devez le convertir au type approprié de la liste pour appliquer l'indexation –

+1

et aussi, il vous manque une parenthèse: Foo foo = (Foo) (e.Result [idx]); –

Répondre

1

Soit vous pouvez faire:

protected void LinqDataSource_Selected(object sender, LinqDataSourceStatusEventArgs e) // event fires after data retrieval complete. 
{ 
    List<int> ids = new List<int>(); 
    if (e.TotalRowCount > 0) 
    { 
     List<Foo> fooList = ((IEnumerable)e.Result).ToList(); 
     for (int idx = 0; idx < fooList.Count; idx++) 
     { 
      Foo foo = fooList[idx]; 
      ids.Add(foo.Id); 
     } 
    } 
} 

Ou

protected void LinqDataSource_Selected(object sender, LinqDataSourceStatusEventArgs e) // event fires after data retrieval complete. 
{ 
    List<int> ids = new List<int>(); 
    if (e.TotalRowCount > 0) 
    { 
     foreach(Foo foo in (IEnumerable)e.Result) 
     { 
      ids.Add(foo.Id); 
     } 
    } 
} 

Si votre sélectionné est le résultat d'une vue filtrée, e.Result sera un IEnumerable de type anonyme, afin d'obtenir les informations nécessitera très probablement l'utilisation d'un objet IQueryable et d'un objet viewmodel.

1

e.Result est un object, vous avez donc besoin de jeter à un type de liste pour pouvoir appliquer l'indexation:

Foo foo = ((List<Foo>)(e.Result))[idx]; 
+0

e.Result peut être Enumerable, il est donc plus sûr d'utiliser .ToList() pour vous assurer que vous pouvez réellement obtenir une liste. –

+0

Je suis d'accord avec vous –

Questions connexes