LINQ在foreach循环中

时间:2012-02-23 20:35:25

标签: c# linq

我有以下内容(注意我是如何在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;之类的事情,但仍然没有运气。

6 个答案:

答案 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) );