2012-12-13 55 views
2

考慮這個,我有一個類中,我想查詢該對象在foreach語句的Linq表:更改foreach語句中的Linq對象?

 IQueryable< tab_policy> Result=from c in db.tab_policy select c; 

     foreach(int i=0;i<3;i++) 
     { 
     Result = from c in Result 
       join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==i) 
       on c.poli_id equals d.poli_id 
       select c; 
     } 

基於先前迭代的價值如何更改結果變量在每次迭代??? 我在這個例子中得到的值只等於最後一次迭代而不是所有的迭代,而在這種情況下,每次迭代結果在foreach內部變化。 雖然當我使用這種迭代沒有像foreach一樣遵循它正常工作。

 Result = from c in Result 
       join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==0) 
       on c.poli_id equals d.poli_id 
       select c; 
     Result = from c in Result 
       join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==1) 
       on c.poli_id equals d.poli_id 
       select c; 
     Result = from c in Result 
       join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==2) 
       on c.poli_id equals d.poli_id 
       select c; 
+6

這foreach語句無法正常工作,你混淆了foreach和語法標準。 – Penfold

+0

爲什麼foreach生病? =) –

+0

請提供實際編譯的代碼。 –

回答

2

你的問題的技術原因是循環變量i在每個Where委託拍攝的,但在每次迭代中修改。這意味着:執行查詢時(循環後)只使用最後一個值i。這可以通過var j = i之類的東西以及在Where中使用j來解決。

但真正的解決方案則簡單得多:

var ids = Enumerable.Range(0,i).ToList(); 
Result = from c in Result 
     join d in db.tab_reg_type_one_to_many.Where(a => ids.Contains(a.reg_id)) 
      on c.poli_id equals d.poli_id 
     select c; 

編輯 正如你正確地評論,這個解決方案是不同於3聯接。差別是微妙而難以捉摸的。有三個(或n)加入您抓取記錄,其中c.poli_id等於d.poli_id三次,而不是1 - 3次。因此,畢竟解決方案是防止修改後關閉:

for(int i = 0; i < 3; i++) 
{ 
    var j = i; 
    Result = from c in Result 
      join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id == j) 
       on c.poli_id equals d.poli_id 
      select c; 
} 
+1

我有一個FxCop規則,在我的http://fxcopcontrib.codeplex.com/項目中檢測到這些問題... – jessehouwing

+0

我需要在結果表中查找包含來自ids的所有值的記錄,例如我想要查找這些記錄其中ids = 0,ids = 1。 ids = 2在一起。當前結果查找所有ids = 1或ids = 1或ids = 2的記錄。 – Kamran

+0

@Kamran並不是Gert的回答爲你做的事情嗎? – nawfal

0

@GertArnold謝謝你的回答。這個解決方案也不正確。相反,我更換的IQueryable有列表和問題解決,因爲需要的時候IQueryable的計算,因此它被延遲計算,但名單是不是這樣的,所以最終的解決方案是:

List<tab_policy> Result = (from c in db.tab_policy select c).ToList(); 
    foreach(int i=0;i<3;i++) 
    { 
    Result = from c in Result 
      join d in db.tab_reg_type_one_to_many.Where(a => a.reg_id==i) 
      on c.poli_id equals d.poli_id 
      select c; 
    } 
+0

嗯,我沒有看到你如何用本地列表連接'db.tab_reg_type_one_to_many',也不知道如何將'IEnumerable'分配給'Result'。在每個迭代中應該有一個'ToList()'。此外:這是一個次優解決方案,因爲您將整個'tab_policy'錶轉儲到內存中。延期執行是linq的優勢之一。我不明白爲什麼我的解決方案不起作用。從技術上講,它與你連續三次的表述完全相同。 –