2009-08-17 3 views
1

Ich frage mich, ob es möglich ist IEnumerable's zusammen zu verbinden.Wie man 2 generische IEnumerators beitreten

Grundsätzlich habe ich eine Reihe von Benutzern und müssen ihren Inhalt von der Datenbank abrufen, damit ich suchen und durchblättern kann.

Ich verwende LINQ to SQL, meinen Code im Moment ist es:

 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 
     } 

Ich hoffe, dass etwas Sinn machen!

Matt

+0

Danke allen! – bExplosion

Antwort

1

Wenn Sie wissen, Ihre Benutzer weniger als 2100 Freunde haben, können Sie die Schlüssel aus dem Daten senden können Sie geladen bereits wieder in die Datenbank leicht:

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

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

Was hier passiert, ist, dass Linq jede Id übersetzt in ein Parameter und baut dann eine IN-Klausel auf, um die Filterung durchzuführen. 2100 ist die maximale Anzahl von Parametern, die der SQL-Server akzeptiert ... Wenn Sie mehr als 2100 Freunde haben, müssen Sie die ID-Liste aufbrechen und die Ergebnislisten kombinieren (Concat).


Oder, wenn Sie eine wörtliche Antwort auf Ihre Frage wollen - Concat ist eine Methode, die eine neue IEnumerable, indem 2 IEnumerables zusammen kombiniert, die die Elemente aus dem ersten zurückkehrt und dann die Elemente aus der zweiten.

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

Vielen Dank Kumpel! Ich habe ein paar Dinge geändert und eine bessere LINQ-Anweisung geschrieben, aber das wird sehr praktisch! – bExplosion

0

Wenn Sie eine innere Verknüpfung tust, Blick auf die .Intersect() Erweiterungsmethode.

0

Welche Dinge verschmelzen Sie?

Es gibt zwei Hauptoptionen, die Sie verwenden können: .SelectMany (...) oder .Concat (...)

+0

Momentan wird der Inhalt von Benutzer1 dann Benutzer 2 und so weiter. Ich möchte all das zusammenführen. Also ich am Ende mit Benutzer 1 + 2 + 3 etc. – bExplosion

+0

Ah. Die Platzierung deines Kommentars "Das ist wo ..." hat mich verraten. (Es ist in der for-Schleife.) –

6

Wenn ich es richtig verstehe, was Sie zu tun versuchen, warum versuchen Sie nicht tun :

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 
      } 

Das werden Ihnen gibt ein IEnumerable<T> wo T einen anonymen Typ ist, die Felder Relationship und Content hat.

Verwandte Themen