2016-12-14 10 views
0

Ich versuche, Linq mit mehreren Where-Klausel zu schreiben und Where-Klausel enthält weiter inline wenn Bedingungen.Linq mehrere Where-Klausel mit If-Bedingung

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(); 

Dies, wenn die Bedingung ausführt (DateTime.UtcNow> = s.MeetingStartTime & & DateTime.UtcNow < = s.MeetingStopTime), auch wenn MeetingStat == null.

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

Wenn ich entfernen diese ..

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

Es funktioniert. Aber ich wollte diese

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

zu überprüfen, um zu schreiben, was falsch mache ich?

+3

„funktioniert nicht“ keine Bedingung ist, dass wir mit Ihnen helfen könnten. Bitte posten Sie die Fehlermeldung. – nvoigt

+0

Redigierte meine Frage. –

+0

, wenn die Bedingung dies ausführt (DateTime.UtcNow> = s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime), selbst wenn MeetingStat == null ist. –

Antwort

0

lassen Sie uns zunächst den Code in einer Weise formatiert erhalten, die nicht zu lesen dummerweise schwierig ist:

Das ist ein bisschen besser.

Jetzt bin ich mir nicht 100% sicher, also kann jemand, der es besser weiß, sich frei fühlen, aber nach C# Operator Precedence hat der OR ("||") Operator einen höheren Vorrang als der bedingte („:?“) Betreiber, so dass diese Zeile:

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

wird im wesentlichen wie folgt ausgewertet zu werden:

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

Wenn MeetingStat gleich wahr ist, ist dies der Ausdruck den ersten Zweig der Evaluierung machen würde ternäre Operation. Geht man von Ihrer Beschreibung in Ihrer Frage, ist dies nicht das, was Sie wollen, so empfehle ich den ternären Betrieb in Klammern um auf Ihre Absicht deutlich zu machen:

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

Wow. Ich kann nicht einmal denken, dass Klammern eine solche Änderung vornehmen können. Es funktioniert jetzt richtig. Ich danke dir sehr. –

0

Ich denke, das Problem ist mit DateTime.UtcNow Besser Sie speichern seinen Wert in einer Variablen nad dann das gleiche in LINQ verwenden, wie wie folgt aus:

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

Es geschieht so, weil Ihre Prädikate innerhalb der Where-Klausel nicht Wenn Sie immer auf SQL übersetzt werden, wie dies unter Verwendung bedeutet, dass Ihr Code funktioniert wie seit UtcTime erwartet nun umwandelbar

+0

immer noch, wenn MeetingStat Null ist, wird es ausgeführt (UtcTime> = s.MeetingStartTime && UtcTime <= s.MeetingStopTime). –

+0

Was willst du eigentlich? Wenn Sie keinen Rest ausführen wollen, wenn 'MeetingStat = null 'bedeutet, ersetzen Sie' || 'durch' && ' –

+0

wenn es Null gibt, sollte es nicht in || einchecken –