簡體   English   中英

延遲加載導航屬性

[英]Lazy loading navigation properties

似乎我無法在我的域服務中的include上放置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套)。 所以即使我的計數器顯示50,它仍然會獲取所有查找值並將它們放入導航屬性中。我也刪除了元數據文件中的所有包含。

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

我認為這是因為你正在訪問一個修改后的閉包,即使它不是,你也不應該這樣做。 這條線

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關於此的文章: 關閉循環變量被認為是有害的 令人驚訝的是,很少有人意識到這個問題。

此外,崩潰查詢可能是個好主意:

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

通過使用ToList()或類似的。 否則,您將重新評估_lookupGroups每個循環的此查詢,如果查詢是數據庫,或者循環很大,這可能是一個令人討厭的性能_lookupGroups

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM