2012-04-11 174 views
1

看來我無法把一個where子句放在包含在我的域服務中 - 所以我們正在做一些循環來獲取我們需要的一些lookupGroups的數據。懶惰加載導航屬性

var _lookupGroups = _lookupGroupRepository.All(); 
     var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID); 

     int i = 0; 

     foreach (var _group in _lookupGroups) 
     { 
      var _values = _lookupValues.Where(x => x.LookupGroupID == _group.LookupGroupID); 

      foreach (var _value in _values) 
      { 
       _group.InstitutionLookupValues.Add(_value); 

       i++; 
      } 

      Console.WriteLine(_group.GroupName + " " + i.ToString()); 
     } 

     return _lookupGroups; 

我放入的計數器用於驗證我所看到的 - 我們迭代的第一組是國家。我的櫃檯會說50,但我的導航屬性會說100,顯示每個機構我們有一套50(我們有2套)。所以它會去得到所有的lookupvalues並把它們放在導航屬性中,即使我的計數器說50也是我已經刪除了所有包含在元數據文件中。

澄清:我有查找值附加到lookupGroups。查找值分配給機構。所以如果我去得到STATES查找組的值,我會得到50個查找值。上面的代碼。當我運行這一行_group.InstitutionLookupValues.Add(_value);我的InstitutionLookupValues = 100(無論機構在考慮所有lookupValues)。但是我的計數器顯示爲50.在某些地方,我獲得的所有查找值都不確定與特定機構綁定的值。

+3

我不明白是什麼問題。你的櫃檯是什麼?這是不同的數字有問題嗎? – 2012-04-11 20:26:14

+0

謝謝 - 已經更新了一下這個問題。 – gevjen 2012-04-11 20:55:52

回答

3

我認爲這是由於你正在訪問一個修改過的閉包造成的,即使它不是,你也不應該。行

var _values = _lookupValues.Where(x => x.LookupGroupID == _group.LookupGroupID); 

可能是不是做你認爲它在做什麼(除非它是C#5)。 lambda是一個委託,閉包將關閉變量,而不是值。這意味着您的代碼_group.LookupGroupID將始終是枚舉器最後一次迭代的最後一個值,因此您只能在一個_group.LookupGroupID上過濾查找值。

嘗試改變塊:

foreach (var _group in _lookupGroups) 
{ 
    var currentGroup = _group;  
    var _values = _lookupValues.Where(x => x.LookupGroupID == currentGroup.LookupGroupID); 

    foreach (var _value in _values) 
    { 
    currentGroup.InstitutionLookupValues.Add(_value); 

    i++; 
    } 

    Console.WriteLine(currentGroup.GroupName + " " + i.ToString()); 
} 

我不知道這是否是問題的原因,但無論如何,你會得到一些神祕的效果。通過在循環中創建自己的變量,可以避免關閉生成的枚舉器變量。

看看Eric Lippert的文章:Closing over the loop variable considered harmful。令人驚訝的是,很少有人知道這個問題。

而且,它可能是一個好主意,摺疊查詢:通過使用ToList()或類似

var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID); 

。否則,您將重新評估_lookupGroups中每個循環的查詢,如果查詢是針對數據庫的,或者循環很大,這可能會導致性能下降。

+1

+1:真棒分析! – Slauma 2012-04-11 22:23:37

+0

這是一個很好的分析 - 謝謝 - 我會試試這個報告,謝謝。 – gevjen 2012-04-12 00:17:01

+0

通過此代碼更改仍然得到了相同的結果 - 當完成第一個lookupGroup時,我會在該導航屬性中看到100個狀態。 – gevjen 2012-04-12 15:30:59