带有 if 条件的 Linq where 子句



我有以下模型:

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)

相关内容

  • 没有找到相关文章

最新更新