我有以下型号:
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)
但是,这不起作用,因为有些文档与某些文件无关。即:项目为null的文档应该返回但是这种情况不会。
这样做的正确方法是什么?
答案 0 :(得分:3)
.Where(arg => !arg.IsDeleted && (arg.Project == null || !arg.Project.IsDeleted))
使用C#6&#34;安全导航操作员&#34; (?.
)将被引入,它带来以下快捷方式(类似于??
):
.Where(arg => !arg.IsDeleted && !(arg.Project?.IsDeleted ?? false))
无论如何:我不确定这是否适用于每个Linq提供商(如EF),因为您通常会使用linq标记您的问题。
答案 1 :(得分:1)
这样的事情:
.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
。< / p>
如果您想要所有孤立的(即没有项目)文档和具有未删除项目的文档(即您只排除属于已删除项目的文档),那么:
.Where(m.Project == null || !m.Project.IsDeleted)