簡體   English   中英

Linq帶if條件的where子句

[英]Linq where clause with if condition

我有以下模型:

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的文檔應該返回,但這種情況下不返回。

正確的方法是什么?

.Where(arg => !arg.IsDeleted && (arg.Project == null || !arg.Project.IsDeleted))

使用C#6,將引入“安全導航操作符”( ?. ),它帶來以下快捷方式(類似於?? ):

.Where(arg => !arg.IsDeleted && !(arg.Project?.IsDeleted ?? false))

無論如何:我不確定這是否適用於每個Linq提供者(例如EF),因為您通常使用標記問題。

像這樣:

.Where(m => !m.IsDeleted && (m.Project == null || !m.Project.IsDeleted))

您需要在檢查Project.IsDeleted之前檢查Project是否為null。 如果您不希望project不為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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM