我有以下内容(注意我是如何在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;
之类的事情,但仍然没有运气。
答案 0 :(得分:9)
好吧,错误是因为您在recprec
循环内声明foreach
。一旦循环退出,它就会失去范围。
您可以在循环内移动其他处理:
foreach (string recid in recids)
{
var recprec = (from rc in db.tblTrucks
where rc.ID == recid
select rc).FirstOrDefault();
if (recprec.TruckMake == "GM")
{
}
}
只需了解每次迭代都会完成一次。您的问题中没有足够的信息来确定这是否是您真正想要的。
答案 1 :(得分:5)
咦?我觉得你很困惑。循环中的每次迭代都会为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
}
答案 2 :(得分:3)
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")
{
// ...
}
}
答案 3 :(得分:0)
问题是当你在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
}
}
答案 4 :(得分:0)
将if语句移动到foreach循环的范围内。否则,即使这有效,您也只能根据列表中的最后一个recid
进行条件化。
答案 5 :(得分:0)
我避免使用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) );