Linq多条款条件如果条件

问题描述:

我想写多个where子句和where子句Linq进一步包含内联如果条件Linq。Linq多条款条件如果条件

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

即使MeetingStat == null,条件执行此操作(DateTime.UtcNow> = s.MeetingStartTime && DateTime.UtcNow

首先,让我们在某种程度上格式的代码,这不是愚蠢难以阅读:

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

哇。我甚至不认为括号可以做出这样的改变。它现在工作正常。非常感谢。 –

我认为这个问题是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 

它正在发生的事情,是因为里面谓词Where子句不得到转换为SQL,如果您使用的是像这意味着您的代码将作品因为UtcTime预期是现在转换

+0

仍然在MeetingStat为空时执行(UtcTime> = s.MeetingStartTime && UtcTime

+0

你究竟想要什么?如果你不想执行休息,如果'MeetingStat = null'意味着用'&&' –

+0

代替'||'如果有null,那么它不应该检查||。 –