2016-11-23 3 views
0

Я хотел бы заменить Еогеасп цикл в следующем коде с помощью LINQ ForEach() Expression:Foreach Loop В LINQ в 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); 
    } 

Любая помощь, пожалуйста !!

+2

есть [подобный вопрос] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for- ienumerablet) – lloyd

+0

похоже, что вам нужно добавить объявление типа в имя, что-то вроде «var Name = db ...» –

+0

@lloyd - этот вопрос ** не является ** дубликатом. Существует разница между ключевым словом C# 'foreach' и расширением' .ForEach'. – Enigmativity

ответ

5

Ваш код не совсем работа (вы добавляете IEnumerable<string> к List<string>). Кроме того, не нужно будет ForEach, так как вы построения списка:

Вы можете сделать это:

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

Но тогда вы ударять базу данных для каждого идентификатора. Вы можете сразу взять все книги с помощью:

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

Которая попадет в базу данных только один раз.

+0

Отличный !! Большое спасибо!! Он работает как ожидалось !! – TanvirArjel

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

Это будет генерировать оператор IN в SQL, тем самым только делает один выбор.

Одна вещь, о которой следует помнить, - это то, что производительность IN ухудшается, поскольку набор (idList в этом случае) становится больше. В случае большого набора вы можете выполнить пакет и выполнить несколько запросов:

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

не могли бы вы добавить объяснение своего ответа, поэтому будущие читатели могут также узнать, как это работает? –

1

Почему бы не выбрать?

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(); 

Или еще лучше: refactorise и выберите ...

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

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

Чтобы ответить на конкретный вопрос, вы можете сделать это:

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); 
});