[英]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),因為您通常使用linq標記問題。
像這樣:
.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.