2015-06-15 5 views
0

У меня есть следующие модели: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) 

Однако это не работает, потому что некоторые документы связаны с проектами, в которых присутствует некий arent. Т.е.: документы, проект которых равен null, должны возвращаться, но этот случай не используется.

Каков правильный способ сделать это?

+0

ли 'IsDeleted '' boolean'? – maniak1982

+0

Вам нужны документы, которые имеют нулевой проект или нет? –

+0

@MattBurland да проекты могут быть пустыми. т.е.: независимые документы. – DarthVader

ответ

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.

Если вы хотите, чтобы все осиротевшие (т.е. без проекта) документы и документы, которые имеют проекты, которые не удаляются (т.е. исключить только те документы, которые принадлежат к удаленным проектам), то:

.Where(m.Project == null || !m.Project.IsDeleted) 
+0

Но это не совсем то, что я хочу, здесь вы говорите, принесите мне документ, где Project не является нулевым и не удаляется, что я хочу, я хочу документы, которые не имеют проектов, и я хочу документы с проектом, но не удаленные. – DarthVader

+0

@DarthVader: Нет, я не. Прочтите еще раз. В нем говорится: «Дайте мне документы, которые не удалены» И которые имеют НИКАКИЕ ПРОЕКТЫ или не имеют проект, который НЕ удаляется. –

+0

Да, я думаю, это сработает. большое спасибо. – DarthVader

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

С # 6, "Безопасная навигация оператора" (?.) ознакомятся, который приносит следующий ярлык (аналог ??):

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

В любом случае: Я не уверен, если это будет работать с каждым поставщиком Linq (например, EF), поскольку вы отметили свой вопрос в целом.

+0

«Безопасный навигатор», это новый для меня. –

+0

Но это не совсем то, что я хочу, здесь вы говорите, принесите мне документ, где Project не является нулевым и не удаляется, что я хочу, я хочу документы, которые не имеют проектов, и я хочу документы с проектом, но не удаленные. – DarthVader

+0

хорошо, если вы видите мою модель, проект имеет значение NULL. – DarthVader

Смежные вопросы