foreach循环中的LINQ
本文关键字:LINQ 循环 foreach | 更新日期: 2023-09-27 18:25:41
我有以下内容(注意我是如何在foreach中使用LINQ的):
foreach (string recid in recids)
{
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc
}).FirstOrDefault();
}
if (recprec.TruckMake == "GM")...
我需要在foreach之后基于recprec
进行一些进一步的处理,但我得到了以下内容:
recprec在当前上下文中不存在。
不知道如何解决这个问题。我试着做一些类似Object recprec = null;
的事情,但仍然没有成功。
错误是因为您在foreach
循环内声明了recprec
。一旦循环退出,它就会失去作用域。
您可以在循环中移动附加处理:
foreach (string recid in recids)
{
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc).FirstOrDefault();
if (recprec.TruckMake == "GM")
{
}
}
只要理解它将为每一次迭代做一次。你的问题中没有足够的信息来确定这是否是你真正想要的。
嗯?我觉得你很困惑。循环中的每次迭代都会给recprec
分配一个不同的实例。循环后要处理哪个实例?你确定要在循环之后进行逻辑运算吗?看起来你可以在循环中完成:
foreach (string recid in recids) {
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc
}).FirstOrDefault();
if (recprec.TruckMake == "GM")...
}
或者,也许你想要TruckMake
等于GM
的所有"事物"?在这种情况下,很简单:
var gms = db.tblTrucks.Where(r => r.TruckMake == "GM");
foreach(var gm in gms) {
// do something with gm
}
recprec
是在foreach
的范围内声明的。一旦超出循环,recprec
就超出了范围。循环的每次迭代都会给您一个recprec
的新实例(以前的实例将不再可访问)。如果你想访问它,请在循环中访问:
foreach (string recid in recids)
{
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc
}).FirstOrDefault();
if (recprec.TruckMake == "GM")
{
// ...
}
}
将if语句移动到foreach循环的范围中。否则,即使这样做有效,您也只能根据列表中的最后一个recid
执行条件操作。
问题是,当您在c#中的循环(或其他闭合语句)中声明变量时,它只存在于该上下文中。您需要在循环之外声明recprec,或者将if语句放在foreach循环中,这取决于您想要在这里完成什么。
所以类似于:
foreach (string recid in recids)
{
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc
}).FirstOrDefault();
if (recprec.TruckMake == "GM")
{
//Do something
}
}
我避免了for循环和for eaches,并尝试使用纯linq。我相信精选的许多是你正在寻找的。。。根据需要添加更多位置。
var results = recids.SelectMany( id => db.tblTrucks.Where( rc => rc.ID = id)
.Where( rc => rc.TruckMake == "GM"));
这可以优化一点,比如
var GMTrucks = db.tblTrucks.Where( rc => rc.TruckMake == "GM").AsEnumerable();
var results = recids.SelectMany( id => GMTrucks.Where( rc => rc.ID = id) );