C# LINQ中的Foreach循环#
我想用LINQ foreach()表达式替换以下代码中的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 =>
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#keywordforeach
和.foreach
扩展方法之间存在差异。有一个问题看起来需要在Name中添加一个类型声明,类似于“var Name=db…”lloyd-这个问题不是重复的。C#keywordforeach
和.foreach
扩展方法之间存在差异。能否请您为您的答案添加一个解释,以便未来的读者也可以了解它的工作原理?能否请您为您的答案添加一个解释,以便未来的读者也可以了解它的工作原理?