我正在使用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
。
有人可以解释这种行为吗?
我猜测在permissionCheck方法中,由于EF不知道如何为函数创建适当的SQL查询(或类似的东西),因此尚未加载子对象。
您可以通过在.AsEnumerable()
之后和Include
之前添加Where
来实现,但这意味着在应用where子句之前将所有Unit和Rule对象从DB加载到内存中,因此可能会使用更多的内存和时间 - 以及因此,可能不是查询事物的有效方式。