2016-12-14 2 views
0

Я пытаюсь написать Linq с предложением multiple where и где предложение дополнительно содержит встроенные условия if.Linq multiple where clause with if condition

List<MeetingVM> students = (
from s in db.Meetings 
where MeetingIsActive == null || s.IsActive == MeetingIsActive 
where MeetingStat == null || MeetingStat == 5 ? (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) : s.Status== MeetingStat 
where StartDate == null || (s.MeetingStartTime >= StartDate && s.MeetingStartTime <= EndDate) 
where s.Status!=4 
orderby s.MeetingStartTime ascending 
select new MeetingVM 
{ 
    MeetingStartTime = s.MeetingStartTime, 
    MeetingStopTime = s.MeetingStopTime, 
    Alias = s.Alias, 
    MeetingSubject = s.MeetingSubject, 
    UserId = s.UserId, 
    Status=s.Status 

}).ToList(); 

Это если условие исполняет (DateTime.UtcNow> = s.MeetingStartTime & & DateTime.UtcNow < = s.MeetingStopTime), даже если MeetingStat == NULL.

where MeetingStat == null || MeetingStat==5 ? (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) : s.Status== MeetingStat 

Если я удалить это ..

MeetingStat==5 ? (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) : 

Он работает. Но я хотел написать это, чтобы проверить

if (MeetingStat==5) 
    (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) 
else 
    s.Status== MeetingStat. 

Что не так я делаю?

+3

«не работает» не условие, которое мы могли бы помочь вам. Отправьте сообщение об ошибке. – nvoigt

+0

Отредактировал мой вопрос. –

+0

если условие выполняет это (DateTime.UtcNow> = s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime), даже если MeetingStat == null. –

ответ

0

во-первых, давайте получить код, отформатированный таким образом, что это не тупо трудно читать:

List<MeetingVM> students = (
    from s in db.Meetings 
    where MeetingIsActive == null || s.IsActive == MeetingIsActive 
    where MeetingStat == null || MeetingStat == 5 ? (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) : s.Status== MeetingStat 
    where StartDate == null || (s.MeetingStartTime >= StartDate && s.MeetingStartTime <= EndDate) 
    where s.Status!=4 
    orderby s.MeetingStartTime ascending 
    select new MeetingVM 
    { 
     MeetingStartTime = s.MeetingStartTime, 
     MeetingStopTime = s.MeetingStopTime, 
     Alias = s.Alias, 
     MeetingSubject = s.MeetingSubject, 
     UserId = s.UserId, 
     Status=s.Status 

    }).ToList(); 

Это немного лучше.

Теперь я не уверен на 100%, поэтому кто-то, кто знает лучше, может отрегулировать меня, но согласно C# Operator Precedence, оператор OR ("||") имеет более высокий приоритет, чем условный (оператора), так что эта строка: «?»:

where MeetingStat == null || MeetingStat == 5 ? ... 

, по существу, получение оценивается так:

where (MeetingStat == null || MeetingStat == 5) ? ... 

Если MeetingStat равно правда, это сделало бы выражение оценки первой ветви тройная операция. Судя по вашему описанию в вашем вопросе, это не то, что вы хотите, поэтому я рекомендую окружающий тройную операцию в скобках, чтобы сделать ваше намерение ясно:

where MeetingStat == null || (MeetingStat == 5 ? ...) 
+0

Wow. Я даже не думаю, что круглые скобки могут сделать такое изменение. Сейчас он работает правильно. Огромное спасибо. –

0

Я думаю, что проблема с DateTime.UtcNow Лучше хранить его значение в переменной-над затем использовать то же самое в LINQ, как например:

DateTime UtcTime = DateTime.UtcNow; 
// and change the condition like this; 
.Where MeetingStat != null && MeetingStat==5 ? (UtcTime >= s.MeetingStartTime && UtcTime <= s.MeetingStopTime) : s.Status== MeetingStat 

Это происходит потому, что ваши предикатами внутри, где положение не было получение переведены на SQL, если вы используете, как это означает, что ваш код будет работает, как ожидалось, поскольку UtcTime теперь конвертируемые

+0

все еще, когда MeetingStat имеет значение null, он выполняет (UtcTime> = s.MeetingStartTime && UtcTime <= s.MeetingStopTime). –

+0

Что вы на самом деле хотите? если вы не хотите выполнять отдых, если 'MeetingStat = null' означает замену' || '' && ' –

+0

, если есть null, то он не должен проверять на || –