2010-02-09 4 views
2

Cette simple requête Linq:Comment faire pour convertir une liste typée anonymement à la liste <T>?

from c in mycontext.Customers 
join o in mycontext.Orders on c.CustomerId equals o.CustomerId 
where o.Status == 1 
select new {c, o} 

se traduira par

List<{c:Customer, o:Order}> 

après avoir appelé ToList().

Quel est le moyen le plus simple de convertir cette liste anonyme en une liste de clients (List<Customer>)?

EDIT: J'ai besoin des commandes pour une condition supplémentaire, j'ai changé ma question originale.

+3

Avez-vous besoin les commandes du tout ou? Sinon, vous pouvez simplement "sélectionner c" au lieu de "select new {c, o}" – cyberzed

+2

Pourquoi adhérez-vous aux commandes, si vous avez seulement besoin de clients? –

Répondre

7
result.Select(o => o.Customer).ToList(); 

Est-ce que vous voulez dire?

+1

Cela rendrait à chaque client X fois, où «X» est le nombre d'ordres associés à chaque client. Votre réponse n'est pas fausse, mais peut-être qu'il voulait les clients distincts, et il sait mieux que cet exemple ne le fait pas. –

+0

Bon point. La question est pourquoi est-ce que la jointure avec les ordres? Quoi qu'il en soit, vous pouvez toujours appeler .Distinct() si nécessaire ... – RoelF

+0

ce n'est pas le moyen le plus simple si –

1

très approche de base, comme vous explecitely demandé « Quelle est la meilleure façon de convertir ce typé anonyme [...] »:

var anonymousEnumerable = from c in mycontext.Customers 
          join o in mycontext.Orders on c.CustomerId equals o.CustomerId 
          select new 
          { 
           c, 
           o 
          }; 
var typedEnumerable = anonymousList.Select(item => item.c).Distinct(); // either referenceCheck or you supply an IEqualityComparer<Customer>-implementation 

peut-être que vous pouvez nous donner plus d'informations un ce que vous voulez exactement à réaliser!

+0

Je veux convertir le résultat de ma requête Linq dans une liste aussi simplement que possible. –

+0

pour ** cette ** liste, je vous ai donné la réponse ... si vous souhaitez une réponse plus générale (aka générique), il pourrait y avoir une autre solution :) –

0

Avez-vous besoin des deux propriétés? Si l'étape si la liste et instancier chaque curstomer ...

Quelque chose comme

List<Customer> customers = new List<Customer>(); 
foreach(item in linqQuery.ToList()) 
{ 

    customers.Add(item.c); 
    //do something with the Order here... 
} 
+2

Vous n'avez pas besoin de '.ToList()'. En fait, vous n'auriez pas besoin de 4 lignes pour le faire, mais c'est une question de choix. –

2

pourquoi ne pas utiliser .ToList<Customers>()

et ne sélectionnez pas les commandes - vous ne les avez pas besoin après la jointure

List<Customer> custList = (from c in mycontext.Customers 
    join o in mycontext.Orders on c.CustomerId equals o.CustomerId 
    where o.Status == 1 
    select c).ToList<Customer>(); 
0
var ledger = from c in mycontext.Customers 
       join o in mycontext.Orders on c.CustomerId equals o.CustomerId 
       where o.Status == 1 
       select new {c, o}; 

var customers = (from row in ledger select row.Customer).Distinct().ToList(); 

Ce serait mon appel d'offres sorta sur une solution (de fautes d'orthographe, etc.) inclus :)

Questions connexes