具有if条件的Linq where子句

时间:2015-06-15 17:30:22

标签: c# linq

我有以下型号:

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的文档应该返回但是这种情况不会。

这样做的正确方法是什么?

2 个答案:

答案 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),因为您通常会使用标记您的问题。

答案 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)