2009-12-02 6 views
4

J'ai donc cette requête LINQ qui se termine dans une mesure, sélectionnez un peu comme ceci:Itérer par IQueryable d'aucun type spécifique?

select new { this1 = table.this1, this2 = othertable.this2 } 

L'appel à cette requête du contrôleur ressemble à quelque chose comme ceci:

ViewData["these"] = theRepo.GetAllThese(someVar, anotherVar); 

Maintenant, quand je passe cette À mon avis, car il n'est pas fortement typé, comment puis-je itérer avec une foreach, comment puis-je le jeter comme un IQueryable ou une liste si je ne sais pas ce qu'il ya dedans?

... est-ce quelque chose comme ça?

IQueryable<???> these = ViewData["These"]; 
foreach (var this in these) {... 

Juste besoin de savoir quoi mettre pour '???' Je pense.

+1

'var ces = ...'? –

+0

var ne peut jamais être un type de retour :) – Webleeuw

+0

Quel est le type de retour de 'GetAllThese()'? –

Répondre

1

Votre requête linq retourne une collection d'objets de type anonyme. Étant anonyme, il n'y a aucun moyen de "appeler leur nom" lors de la déclaration d'une variable explicitement typée. Ainsi, le vrai type/forme des objets n'est connu que dans la méthode d'action où les objets sont définis.

Le getter indexé de l'objet ViewData a un type de retour object, et sans connaître le nom du type, vous voulez être en mesure de jeter la valeur de retour de ViewData["these"] à quelque chose d'utile.

Ce que vous pouvez faire à la place, est de créer un modèle - plus précisément un "view model" - qui définit la structure des objets que vous sélectionnez LINQ:

public class FoobarViewModel 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 

et redéfinir votre requête pour faire sélectionner comme ceci:

select new FoobarViewModel { foo = table.this1, bar = othertable.this2 } 

vos objets partagent maintenant une classe nommée commune, et votre collection peut être facilement casté en type approprié dans la vue.

2

Vous ne pouvez pas utiliser un type anonyme (sélectionnez une nouvelle {Propriété = valeur}) en dehors de la portée dans laquelle il est défini. Donc, vous devez utiliser foreach (var x dans {yourQueryHere}) à partir de la méthode que vous avez défini la requête dans

Exemple:. Ceci est possible:

public void myMethod() { 
     var x = from c in IEnumerable select new { Prop = value }; 
     foreach (var y in x) { 
     } 
    } 

Ceci est impossible:

public void myMethod() { 
     foreach (var y in myMethod2()) { 
     } 
    } 

    public IQueryable<???> myMethod2() { 
     return from c in IEnumerable select new { Prop = value }; 
    }