2008-09-10 20 views
12

J'ai une requête Linq que je veux appeler à partir de plusieurs endroits:Comment puis-je renvoyer un type anonyme d'une méthode?

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new { 
          a.Key, 
          a.MyValue 
          }; 

Comment puis-je créer une méthode, mettre ce code dans, puis l'appeler?

public ??? GetSomeData() 
{ 
    // my Linq query 
} 
+0

Pourquoi ne vous retourne pas Diction ? –

+1

c'était juste un exemple simple. J'ai beaucoup plus de valeurs que je sélectionne actuellement qui ne tiennent pas dans un dictionnaire – ScottG

+0

duplication possible de [Renvoyer le type anonyme?] (Http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

Répondre

9

IQueryable et IEnumerable fonctionnent tous les deux. Mais vous souhaitez utiliser une version spécifique au type, IQueryable < T > ou IEnumerable < T >.

Vous voudrez donc créer un type pour conserver les données.

var myData = from a in db.MyTable 
      where a.MyValue == "A" 
      select new MyType 
      { 
       Key = a.Key, 
       Value = a.MyValue 
      }; 
+0

MERCI beaucoup pour l'expansion de cette solution. La clé utilisait un type spécifique. Cela fonctionne très bien – ScottG

+0

Hé, j'ai donné cette réponse 1 heure avant Darren. Me dit juste pour ne pas donner un échantillon :) –

+0

Pour être clair, ce qui se passe est que select new {...} crée un type anonyme (nécessitant l'utilisation du mot-clé var). Ce type n'a pas de nom et ne peut être utilisé que localement dans la méthode qui l'a créé (sauf si vous utilisez la réflexion). Pour l'utiliser à l'extérieur, vous devez créer un type nommé. – Lucas

7

IQueryable

Ainsi, votre déclaration de méthode ressemblerait

public IQueryable GetSomeData() 
+0

Merci! Cela aide énormément/ – ScottG

+2

En faisant cela, vous n'aurez pas d'intellisense et ne pourrez accéder aux propriétés des objets que par réflexion. –

+1

Sachez que la requête n'a pas encore démarré. –

2

Si vous voulez revenir, vous avez besoin d'un type.

Au lieu de var, déclarez en utilisant IEnumerable<> et renvoyez cette variable. Itérer à travers elle exécute réellement la requête.

3

Une méthode générique devrait vous donner IntelliSense:

public class MyType {Key{get;set;} Value{get;set}} 

public IQueryable<T> GetSomeData<T>() where T : MyType, new() 
{ return from a in db.MyTable 
      where a.MyValue == "A" 
      select new T {Key=a.Key,Value=a.MyValue}; 
}