LINQ

2012-02-23 44 views
-2

我有以下的(注意我如何在foreach内使用LINQ):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;但仍然没有运气。

回答

9

那么,错误是因为你声明recprecforeach循环。一旦循环退出,它就会失去范围。

你可以移动的附加处理的循环中:

foreach (string recid in recids) 
{ 

    var recprec = (from rc in db.tblTrucks 
        where rc.ID == recid 
        select rc).FirstOrDefault(); 

    if (recprec.TruckMake == "GM") 
    { 
    } 
} 

才明白,这将是对每次迭代进行一次。您的问题中没有足够的信息来确定这是否是您真正想要的。

0

问题是,当你在c#中的循环(或其他闭合语句)中声明一个变量时,它只存在于该上下文中。你需要在你的循环之外声明recrecc,或者把你的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 
     } 
    } 
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") 
    { 
     // ... 
    } 
} 
0

将if语句移到foreach循环的范围中。否则,即使这个工作正常,你只会根据列表中最后一个recid来执行条件。

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 
} 
0

我避免了for循环和eaches,并尝试使用纯linq。我相信所选择的许多是您正在寻找的...根据需要添加更多wheres。

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