LINQ

2012-02-23 48 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));