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循环中的LINQ

错误是因为您在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) );