C# LINQ中的Foreach循环#

C# LINQ中的Foreach循环#,c#,linq,C#,Linq,我想用LINQ foreach()表达式替换以下代码中的foreach循环: 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 =>

我想用LINQ foreach()表达式替换以下代码中的foreach循环:

    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);
    }
List idList=newlist(){1,2,3};
IEnumerable nameList=新列表();
foreach(idList中的int id)
{
var Name=db.Books.Where(x=>x.BookId==id);
姓名列表。添加(姓名);
}
请帮忙

这将在SQL中生成IN语句,从而只执行一次select

需要注意的一点是,随着集合(在本例中为idList)变大,IN的性能会下降。对于大型集合,可以批处理集合并执行多个查询:

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;
}
int start=0;
整批=1000;
while(startbatchSet.Contains(x.BookId))
.选择(x=>x.BookName)
.ToList());
开始+=批次;
}
这将在SQL中生成IN语句,从而只执行一次select

需要注意的一点是,随着集合(在本例中为idList)变大,IN的性能会下降。对于大型集合,可以批处理集合并执行多个查询:

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;
}
int start=0;
整批=1000;
while(startbatchSet.Contains(x.BookId))
.选择(x=>x.BookName)
.ToList());
开始+=批次;
}
为什么不选择

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();
List idList=newlist(){1,2,3};
List nameList=idList
.Select(id=>db.Books.Where(x=>x.BookId==id)。Select(x=>x.BookName))
.ToList();
或者更好:重构并选择

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

List<string> nameList = db.Books
    .Where(x => idList.Contains(x.BookId))
    .Select(x => x.BookName))
    .ToList();
int[]idList=newint[]{1,2,3};
List name List=db.Books
.Where(x=>idList.Contains(x.BookId))
.选择(x=>x.BookName))
.ToList();
为什么不选择

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();
List idList=newlist(){1,2,3};
List nameList=idList
.Select(id=>db.Books.Where(x=>x.BookId==id)。Select(x=>x.BookName))
.ToList();
或者更好:重构并选择

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

List<string> nameList = db.Books
    .Where(x => idList.Contains(x.BookId))
    .Select(x => x.BookName))
    .ToList();
int[]idList=newint[]{1,2,3};
List name List=db.Books
.Where(x=>idList.Contains(x.BookId))
.选择(x=>x.BookName))
.ToList();

您的代码不太有效(您正在向
列表添加
IEnumerable
)。您也不需要ForEach
,因为您正在构建列表:

您可以这样做:

var nameList = idList.SelectMany(id => db.Books.Where(x => x.BookId == id)
                     .Select(x => x.BookName)).ToList();
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);
});
但随后,您将针对每个ID访问数据库。您可以使用以下工具一次抓取所有书籍:

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

它只会命中数据库一次。

您的代码不太有效(您正在将
IEnumerable
添加到
列表中)。您也不需要ForEach
,因为您正在构建列表:

您可以这样做:

var nameList = idList.SelectMany(id => db.Books.Where(x => x.BookId == id)
                     .Select(x => x.BookName)).ToList();
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);
});
但随后,您将针对每个ID访问数据库。您可以使用以下工具一次抓取所有书籍:

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

它只会在数据库中运行一次。

要回答您的特定问题,您可以执行以下操作:

var nameList = idList.SelectMany(id => db.Books.Where(x => x.BookId == id)
                     .Select(x => x.BookName)).ToList();
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);
});
List idList=newlist(){1,2,3};
列表名称列表=新列表();
idList.ForEach(id=>{
var Name=db.Books.Where(x=>x.BookId==id);
姓名列表。添加(姓名);
});

要回答您的具体问题,您可以执行以下操作:

var nameList = idList.SelectMany(id => db.Books.Where(x => x.BookId == id)
                     .Select(x => x.BookName)).ToList();
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);
});
List idList=newlist(){1,2,3};
列表名称列表=新列表();
idList.ForEach(id=>{
var Name=db.Books.Where(x=>x.BookId==id);
姓名列表。添加(姓名);
});

有一个问题看起来需要在Name中添加一个类型声明,比如“var Name=db…”@lloyd-这个问题不是重复的。C#keyword
foreach
.foreach
扩展方法之间存在差异。有一个问题看起来需要在Name中添加一个类型声明,类似于“var Name=db…”lloyd-这个问题不是重复的。C#keyword
foreach
.foreach
扩展方法之间存在差异。能否请您为您的答案添加一个解释,以便未来的读者也可以了解它的工作原理?能否请您为您的答案添加一个解释,以便未来的读者也可以了解它的工作原理?