EF Lazy Loading,将查询提取到另一个方法导致导航属性为null

问题描述 投票:0回答:1

我正在使用Entity Framework并且有一个应用Access Control Listings的模型。我的模型和ACL模型之间存在一对多的关系。

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

这是一个例子:

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

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

但是,当我将其提取为以下形式时,它会抛出一个值不能为null的异常,因为unit.AccessControlRules为null。

    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

有人可以解释这种行为吗?

c# entity-framework lazy-loading
1个回答
1
投票

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

您可以通过在.AsEnumerable()之后和Include之前添加Where来实现,但这意味着在应用where子句之前将所有Unit和Rule对象从DB加载到内存中,因此可能会使用更多的内存和时间 - 以及因此,可能不是查询事物的有效方式。

© www.soinside.com 2019 - 2024. All rights reserved.