我有以下模型:
class Project{
bool IsDeleted {set;get;}
ICollection<Document> Documents {set;get;}
}
class Document{
Project Project {set;get;}
int? ProjectId {set;get;}
}
我正在查询文档存储库,我想获取所有文档以及项目未删除的文档。
var documents = _repository.Include(p=>p.Project)
.Where(m => m.IsDeleted == false)
.Where(x=> x.Project.IsDeleted == false)
但是,这是行不通的,因为有些文档与项目相关联,而有些则没有。即:该项目为空的文档应返回,但这种情况不会返回。
正确的方法是什么?
.Where(arg => !arg.IsDeleted && (arg.Project == null || !arg.Project.IsDeleted))
在 C# 6 中,将引入"安全导航运算符"(?.
),它带来了以下快捷方式(类似于 ??
):
.Where(arg => !arg.IsDeleted && !(arg.Project?.IsDeleted ?? false))
无论如何:我不确定这是否适用于每个 Linq 提供程序(如 EF),因为您通常已使用 linq 标记了您的问题。
像这样:
.Where(m => !m.IsDeleted && (m.Project == null || !m.Project.IsDeleted))
您需要先检查Project
是否为空,然后再检查是否Project.IsDeleted
。如果你不想要那些项目不null
,那么你只需要:
.Where(m => !m.IsDeleted && m.Project != null && !m.Project.IsDeleted)
请记住:快捷方式评估是您的朋友。在第一个示例中,如果m.Project == null
,则它将评估为true
,它甚至不会尝试检查m.Project.IsDeleted
并且您不会得到NullReferenceException
。
如果您想要所有孤立的(即没有项目)文档以及具有未删除的项目的文档(即您只排除属于已删除项目的文档),那么:
.Where(m.Project == null || !m.Project.IsDeleted)