2016-11-23 1 views
0

Ich möchte die foreach Schleife im folgenden Code mit LINQ foreach() Expression ersetzen:Foreach Loop In LINQ in C#

List<int> idList = new List<int>() { 1, 2, 3 }; 

    IEnumerable<string> nameList = new List<string>(); 

    foreach (int id in idList) 
    { 
     var Name = db.Books.Where(x => x.BookId == id).Select(x => x.BookName); 
     nameList.Add(Name); 
    } 

Alle Bitte Hilfe !!

+2

gibt es eine [ähnliche Frage] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for- – lloyd

+0

sieht so aus, als müssten Sie dem Namen eine Typdeklaration hinzufügen, so etwas wie "var Name = db ..." –

+0

@lloyd - Diese Frage ** ist nicht ** ein Duplikat. Es gibt einen Unterschied zwischen dem C# -Schlüsselwort "foreach" und der Erweiterungsmethode ".ForEach". – Enigmativity

Antwort

5

Ihr Code funktioniert nicht ganz (Sie hinzufügen eine IEnumerable<string> zu einem List<string>). Sie müssen auch nicht ForEach, da Sie die Liste sind die Konstruktion:

Sie dies tun können:

var nameList = idList.SelectMany(id => db.Books.Where(x => x.BookId == id) 
        .Select(x => x.BookName)).ToList(); 

Aber dann sind Sie die Datenbank für jede ID schlagen. Sie können alle Bücher auf einmal mit:

var nameList = db.Books.Where(b => idList.Contains(b.BookId)) 
         .Select(b => b.BookName).ToList(); 

Welches wird nur die Datenbank einmal schlagen.

+0

Großartig !! Danke vielmals!! Es funktioniert wie erwartet !! – TanvirArjel

0
nameList.AddRange(
      db.Books.Where(x => idList.Contains(x.BookId)) 
        .Select(x => x.BookName) 
        .ToList()); 

Dies wird eine IN-Anweisung in der SQL, erzeugen dadurch nur eine einzige Auswahl tun.

Eine Sache, auf die man achten sollte, ist die Leistung von IN degradiert, da das Set (idList in diesem Fall) größer wird. Bei einem großen Satz können Sie den Satz stapelweise verarbeiten und mehrere Abfragen ausführen:

int start = 0; 
int batch = 1000; 
while (start < idList.Count()) 
{ 
    var batchSet = idList.Skip(start).Take(batch); 
    nameList.AddRange(
      db.Books.Where(x => batchSet.Contains(x.BookId)) 
        .Select(x => x.BookName) 
        .ToList()); 
    start += batch; 
} 
+0

könnten Sie bitte eine Erklärung zu Ihrer Antwort hinzufügen, damit zukünftige Leser auch lernen können * wie * es funktioniert? –

1

Warum nicht eine Auswahl?

List<int> idList = new List<int>() { 1, 2, 3 }; 

List<string> nameList = idList 
    .Select(id => db.Books.Where(x => x.BookId == id).Select(x => x.BookName)) 
    .ToList(); 

Oder noch besser: refactorise und wählen ...

int[] idList = new int[] { 1, 2, 3 }; 

List<string> nameList = db.Books 
    .Where(x => idList.Contains(x.BookId)) 
    .Select(x => x.BookName)) 
    .ToList(); 
-1

Ihre Frage zu beantworten, können Sie dies tun:

List<int> idList = new List<int>() { 1, 2, 3 }; 

List<string> nameList = new List<string>(); 

idList.ForEach(id => { 
    var Name = db.Books.Where(x => x.BookId == id).Select(x => x.BookName); 
    nameList.Add(Name); 
});