C# 延迟加载导航属性

C# 延迟加载导航属性,c#,entity-framework,wcf-ria-services,C#,Entity Framework,Wcf Ria Services,似乎我无法在我的域服务中的include上放置where子句,所以我们正在做一些循环来获取一些查找组所需的数据 var _lookupGroups = _lookupGroupRepository.All(); var _lookupValues = _institutionLookupValueRepository.All().Where(x => x.InstitutionID == _userProfile.InstitutionID); in

似乎我无法在我的域服务中的include上放置where子句,所以我们正在做一些循环来获取一些查找组所需的数据

   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。我还删除了元数据文件中的所有包含项


澄清一下:我有附加到lookupgroup的lookupvalue。查找值被指定给机构。因此,如果我去获取查找组状态的值,我将返回50个查找值。上面的代码。当我运行此行时_group.InstitutionLookupValues.Add(_value);my InstitutionLookupValues=100(获取所有查找值,不考虑机构)。但我的计数器显示50。在某个地方,我得到了所有的查找值,但不确定与特定机构相关的值。

我认为这是因为您正在访问一个修改的闭包,即使它不是,您也不应该访问。线路

var _values = _lookupValues.Where(x => x.LookupGroupID == _group.LookupGroupID);
很可能没有做你认为它在做的事情(除非是C#5)。lambda是一个委托,闭包将关闭变量,而不是值。这意味着您的代码
\u组。LookupGroupID
将始终是枚举数最后一次迭代的最后一个值,因此您将只筛选一个
\u组上的查找值。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()
或类似方法。否则,您将对
\u lookupGroups
中的每个循环重新评估此查询,如果查询是针对数据库的,或者循环很大,这可能会对性能造成严重影响。

我不明白问题出在哪里。你的柜台是什么?不同的数字有问题吗?谢谢-已经更新了一点问题。这是一个很好的分析-谢谢-我会尝试一下,然后再报告,谢谢。这次代码更改仍然得到了相同的结果-我在导航属性中看到100个状态,当它通过第一个查找组时。嗯,它仍然有效;)你是说每个
\u组
(我假设与EF表匹配)在开始时在
InstitutionLookupValues
上都有一个空集合?如果不运行
Add
方法,在循环后,
InstitutionLookupValues
会得到什么结果?