代码之家  ›  专栏  ›  技术社区  ›  S. Walker

EF延迟加载,将查询提取到另一个方法将导致导航属性为null

  •  0
  • S. Walker  · 技术社区  · 6 年前

    在大多数需要查询模型的地方,我只需要返回具有相应ACL的模型。

    var myUnits = _context.Units
        .Include(unit => unit.AccessControlRules)
        .Where(unit => unit.AccessControlRules.FirstOrDefault(acl => acl.UserId == 15) != null);
    

    每次都能正常工作。它只返回具有Id为15的用户的acl的单元。

    但是,当我将其提取到下面的表单中时,它会抛出一个value cannot be null异常,因为unit.AccessControlRules为空。

        var myUnits = _context.Units
        .Include(unit => unit.AccessControlRules)
        .Where(unit => permissionCheck(unit));
    
        private bool permissionCheck(Unit unit)
        {
            return unit.AccessControlRules.FirstOrDefault(acl => acl.UserId == 15) != null;
        }
    

    它是完全相同的代码,而第二个(非工作)版本 unit.AccessControlRules == null .

    有人能解释一下这种行为吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   shunty    6 年前

    我猜在permissionCheck方法中,由于EF不知道如何为函数(或类似的东西)创建适当的SQL查询,所以子对象尚未加载。

    你呢 能够 通过添加 .AsEnumerable() Include 在那之前 Where