2009-08-17 7 views
1

Je me demande s'il est possible de réunir IEnumerable. Fondamentalement, j'ai un tas d'utilisateurs et j'ai besoin d'obtenir leur contenu de la base de données afin que je puisse rechercher et feuilleter.Comment rejoindre 2 IEnumerators génériques

J'utilise LINQ to SQL, mon code au moment où il:

 public IEnumerable<content> allcontent; 

     //Get users friends 
     IEnumerable<relationship> friends = from f in db.relationships 
              where f.userId == int.Parse(userId) 
              select f; 

     IEnumerable<relationship> freindData = friends.ToList(); 

     foreach (relationship r in freindData) 
     { 
      IEnumerable<content> content = from c in db.contents 
              where c.userId == r.userId 
              orderby c.contentDate descending 
              select c; 

     // This is where I need to merge everything together 
     } 

J'espère que donner un sens!

Matt

+0

Merci à tous! – bExplosion

Répondre

1

Si vous savez que vos utilisateurs auront moins de 2100 amis, vous pouvez envoyer les clés à partir des données que vous avez déjà chargées dans la base de données facilement:

List<int> friendIds = friendData 
    .Select(r => r.UserId) 
    .Distinct() 
    .ToList(); 

List<content> result = db.contents 
    .Where(c => friendIds.Contains(c.userId)) 
    .ToList(); 

Qu'est-ce qui se passe ici est que Linq traduit chaque Id en un paramètre, puis construit une clause IN pour faire le filtrage. 2100 est le nombre maximum de paramètres que le serveur SQL acceptera ... si vous avez plus de 2100 amis, vous devrez décomposer la liste d'ID et combiner (concaténer) les listes de résultats.


Ou, si vous voulez une réponse plus littérale à votre question - Concat est une méthode qui combine 2 IEnumerables ensemble en créant une nouvelle IEnumerable qui retourne les articles de la première, puis les articles de la deuxième.

IEnumerable<content> results = Enumerable.Empty<content>(); 
foreach (relationship r in friendData) 
{ 
    IEnumerable<content> content = GetData(r); 
    results = results.Concat(content); 
} 
+0

Merci beaucoup mate! J'ai fini par changer quelques choses et écrire une meilleure déclaration LINQ, mais cela va venir super pratique! – bExplosion

0

Si vous faites une jointure, regardez la méthode d'extension .Intersect().

0

De quoi fusionnez-vous?

Il y a deux principales options que vous pouvez utiliser: .SelectMany (...) ou .Concat (...)

+0

Actuellement, il obtient le contenu de l'utilisateur1, puis l'utilisateur 2 et ainsi de suite. Je veux fusionner tout ça ensemble. Donc je me retrouve avec l'utilisateur 1 + 2 + 3 etc. – bExplosion

+0

Ah. Le placement de votre commentaire «ceci est où ...» m'a ébranlé. (C'est à l'intérieur de la boucle for.) –

6

Si je comprends bien ce que vous essayez de faire, pourquoi ne pas essayer de faire :

var result = from r in db.relationships 
      from c in db.contents 
      where r.userId == int.Parse(userId) 
      where c.userId == r.UserId 
      orderby c.contentDate descending 
      select new { 
       Relationship = r, 
       Content = c 
      } 

Cela vous donnera un IEnumerable<T>T est un type anonyme qui a des champs Relationship et Content.