[英]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.