2010-12-10 7 views
0

Je possède ce code:LINQ: Renvoie la valeur var?

public static List<object> GetInbox(Guid id) 
    { 
     using (Flirt4dateDBDataContext dc = new Flirt4dateDBDataContext()) 
     { 
      List<object> query = from pm in dc.PrivateMessages 
         join user in dc.Users 
         on pm.Sender equals user.UserID 
         select new 
         { 
          SenderName = user.Username 
         }; 


      return query; 

     } 
    } 

Il ne fonctionne pas. Erreur 1 Impossible de convertir implicitement le type 'System.Linq.IQueryable' en 'System.Collections.Generic.List'. Une conversion explicite existe (manque-t-il une distribution?) O: \ Flirt4Date \ Flirt4Date \ DAL \ PrivateMessageHandling.cs 69 29 DAL

Alors, que faire? Je sais, une option possible est d'écrire une classe et redonner une liste de cela, mais j'ai houndrets de requête comme ça et je serais heureux si je peux avoir une solution générique ...

+0

L'objet anonyme créé et renvoyé à l'appelant n'est pas sérialisable. Néanmoins, comment voulez-vous consommer votre valeur de retour en toute sécurité sans connaître le type de retour? vous ne pouvez pas itérer sur eux et dire foreach (var item dans la liste) {Console.WriteLine (item. ????)} –

+0

duplication possible de [LINQ to SQL: Retourne un type anonyme?] (http://stackoverflow.com/questions/534690/linq-à-sql-return-anonymous-type) – nawfal

Répondre

4

Modifier votre code à:

List<object> query = (from pm in dc.PrivateMessages 
        join user in dc.Users 
        on pm.Sender equals user.UserID 
        select new 
        { 
         SenderName = user.Username 
        }).ToList(); 

ou changer votre fonction:

public static IEnumerable<object> GetInbox(Guid id) 
{ 
    using (Flirt4dateDBDataContext dc = new Flirt4dateDBDataContext()) 
    { 
     IEnumerable<object> query = from pm in dc.PrivateMessages 
        join user in dc.Users 
        on pm.Sender equals user.UserID 
        select new 
        { 
         SenderName = user.Username 
        }; 


     return query; 

    } 
} 
1

vous êtes requête est un IQueryable retournaient; vous devez convertir le résultat de votre requête en un type List <>, en utilisant l'opérateur ToList

1

La valeur renvoyée par la requête Linq est du type IQueryable, pour la convertir en liste, vous devrez créer un new Liste passant l'objet au constructeur.

Essayez ceci:

var result = from pm in dc.PrivateMessages ... 

List<object> query = new List<object>(result); 

... ou utilisez la méthode d'extension ToList() comme suggéré dans les autres réponses.

-1

Vous pouvez également utiliser « var query » au lieu de « List<object> query » comme retour est en fait pas vraiment un List<object>

0

vous returing une variable de requête et depuis Linq est basée sur le concept d'exécution deffered-à-dire la requête stockée dans la variable de requête ne sera pas eveluated jusqu'à ce que vous appelez une iterator sur cela comme (ToList(), ToDictionary(), toArray(), le comte() etc ..)

si chnage un peu le code fonctionnera comme celui-ci

public static List<object> GetInbox(Guid id) 
    { 
     using (Flirt4dateDBDataContext dc = new Flirt4dateDBDataContext()) 
     { 
      List<object> query = (from pm in dc.PrivateMessages 
         join user in dc.Users 
         on pm.Sender equals user.UserID 
         select new 
         { 
          SenderName = user.Username 
         }).ToList(); 


      return query; 

     } 
    } 
0

Souhaitez-vous utiliser l'exécution différée ou souhaitez-vous exécuter la requête tout de suite? Si vous voulez différer l'exécution, renvoyer un IQueryable ou IEnumerable sinon retourner une liste. S'il est différé, soyez prudent avec le bloc "using Flirt4dateDBDataContext dc = new Flirt4dateDBDataContext()", il peut disposer le datacontext avant l'exécution de la requête.

Questions connexes