简体   繁体   English

Linq具有if条件的多重where子句

[英]Linq multiple where clause with if condition

I am trying to write Linq with multiple where clause and where clause further contains inline if conditions. 我正在尝试使用多个where子句和where子句进一步包含内联if条件编写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();

This if condition executes (DateTime.UtcNow >= s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime) even if MeetingStat==null. 即使MeetingStat == null,也会执行此条件(DateTime.UtcNow> = s.MeetingStartTime && DateTime.UtcNow <= s.MeetingStopTime)。

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

If i remove this.. 如果我删除此..

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

It works. 有用。 But i wanted to write this to check 但是我想写这个来检查

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

What wrong am i doing? 我在做什么错?

I think the problem is with DateTime.UtcNow Better you store its value in a variable nad then use the same in LINQ as like this: 我认为问题在于DateTime.UtcNow最好将其值存储在变量nad中,然后在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

It is happening so because your predicates inside the Where clause was not getting translated to SQL, If you are using like this means your code will works as expected since UtcTime is now convertible 之所以如此,是因为您的Where子句中的谓词未转换为SQL,如果您这样使用,则意味着代码将按预期工作,因为UtcTime现在可转换

First, let's get the code formatted in a way that's not stupidly difficult to read: 首先,让我们以一种并非很难理解的方式来格式化代码:

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

That's a little better. 好一点。

Now, I'm not 100% sure on this, so someone who knows better can feel free to correct me, but according to C# Operator Precedence , the OR ("||") operator has a higher precedence than the conditional ("?:") operator, so this line: 现在,我不太确定这一点,因此更了解的人可以随时纠正我,但是根据C#运算符优先级 ,OR(“ ||”)运算符的优先级高于条件运算符(“?”)。 :“)运算符,因此此行:

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

is essentially getting evaluated like this: 本质上是这样评估的:

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

If MeetingStat is equal to true, this would make the expression evaluate the first branch of the ternary operation. 如果MeetingStat等于true,这将使表达式评估三元运算的第一个分支。 Judging from your description in your question, this is not what you want, so I recommend surrounding the ternary operation in parentheses to make your intention clear: 从您对问题的描述来看,这不是您想要的,因此我建议在括号中包含三元运算,以使您的意图清楚:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM