在做LINQ查询时,我在传递条件时遇到了这个问题

时间:2018-03-07 08:05:36

标签: c# linq

var JobList = new UpdateJobDetails();
JobList.jobDetails = (from b in Result 
                      where (b.JobStatus !=4 && b.ActionStatus != 0) || (b.JobStatus !=5 && b.ActionStatus != 0)  
                      select b).ToList();

如果我这样做,则此查询将所有条件视为单独的实体。

所以我做的是:

List<Jobs> Job = new List<Jobs>();
foreach (var item in Result)
{
    if ((item.JobStatus == 4 && item.ActionStatus == 0) || (item.JobStatus == 5 && item.ActionStatus == 0))
    {
        Job.Add(item);
    }
}
var X = (from b in Result
         where !Job.Any(x => x.ID == b.ID)
         select b).ToList();
JobList.jobDetails = X;

所以在这里我只是想知道我可以通过LINQ Query实现这一点。正如我所经历的Linq Query不接受多个条件的组合。 如果我错了,请纠正我。 TIA

4 个答案:

答案 0 :(得分:2)

请考虑以下事项:

(a != 4 && b != 0) || (a != 5 && b != 0)
  

a与4不同,b与0不同, OR
  a与5不同,b与0

不同

通过评论添加了步骤

这相当于:

b != 0 && (a != 4 || a != 5)
  

b与0 AND
不同   a与4不同,或a与5

不同

这相当于:

b != 0

由于:

  

a不能等于4和5

现在,只需将a替换为b.JobStatus,将b替换为b.ActionStatus,您就会明白为什么您的第一个查询无法返回您的预期

回答你的问题

是的,你错了,Linq Query接受多种条件的组合。

你只需要写好条件。

这个(foreach循环中的条件):

(item.JobStatus == 4 && item.ActionStatus == 0) || (item.JobStatus == 5 && item.ActionStatus == 0)

相反(初始查询中的条件):

(b.JobStatus !=4 && b.ActionStatus != 0) || (b.JobStatus !=5 && b.ActionStatus != 0)

如果你想要相反:

(a == 4 && b == 0) || (a == 5 && b == 0) // 1)

可以简化为:

b == 0 && (a == 4 || a == 5)             // 2)

使用:

!((a == 4 && b == 0) || (a == 5 && b == 0)) // 1) basic negation

或:

(a != 4 || b != 0) && (a != 5 || b != 0)    // 1) ditributed negation

甚至:

!(b == 0 && (a == 4 || a == 5))             // 2) basic negation

或:

b != 0 || (a != 4 && a != 5)                // 2) distributed negation

上述四个条件相同。

答案 1 :(得分:0)

尝试以下linq查询,

var JobList = new UpdateJobDetails();
JobList.jobDetails = (from b in Result where (b.ActionStatus != 0 && b.JobStatus !=4 && b.JobStatus !=5)  select b).ToList();

答案 2 :(得分:0)

你编写查询的方式对我来说似乎不对。你可以像

那样重写
var JobList = new UpdateJobDetails();
JobList.jobDetails = from b in Result 
                     where ((b.JobStatus !=4 && b.ActionStatus != 0) || (b.JobStatus !=5 && b.ActionStatus != 0))
                    select b;

(或)使用多个Where条件

JobList.jobDetails = Result
                    .Where(b => b.JobStatus !=4 && b.ActionStatus != 0)
                    .Where(c => c.JobStatus !=5 && c.ActionStatus != 0)
                    .Select(b => b); 

答案 3 :(得分:0)

我测试了所有解决方案。我得到了什么。

  1. 我的整个清单 enter image description here

  2. 解决方案建议由@Rafalon b!= 0&amp;&amp; (a!= 4 || a!= 5) enter image description here

  3. 解决方案建议@vc 74 enter image description here
  4. @Rahul建议的解决方案 enter image description here
  5. 我以前的那个 enter image description here
  6. 所以我从@vc 74提出的解决方案得到了我想要的结果