2015-09-04 144 views
2

所以,我有一个SQL查询是这样工作的,Linq查询不返回任何东西

SELECT * 
FROM db.history a 
inner join db.history b 
on a.image_id = image_id 
and b.action in(200,201,202) 
where a.user_id = 'someuser' 
and a.action in (104) 
and a.time_stamp between '2015-06-22 00:00:00' and '2015-06-22 23:59:59' 

现在,我试图执行相同的查询中Linq在不同的部分是这样的:

1)首先,我得到一切从history表,其中action = 103 and 104那就是日期范围之间:

var history = Db.Histories 
          .Select(i => i) 
          .Where(i 
            => 
            && i.TimeStamp >= startDate && i.TimeStamp <= endDate    
            && (i.ActionId == 103 || i.ActionId == 104))               
          .OrderBy(i => i.UserId)              
          .ToArray(); 

2)我得到所有用户:

var users = history.Select(i => i.UserId).Distinct().ToList(); 

这两个查询工作的罚款。然而,当我尝试遍历所有用户实行SQL查询不返回任何东西:

for(var user in users) 
{ 
    var query = from h in history 
       join h2 in Db.Histories.Where(i => i.Action == 200 || i.Action == 201 || i.Action == 202) 
       on h.ImageId equals h2.ImageId 
       where h.UserId.Equals(user) && h.Action == 104 
       select h; 
} 

为什么是空的?

谢谢

+0

为什么内用b首先加入?在我看来,你可以把(200,201,202)中的a.action放在where子句中,而不是(200,201,202) – JoaoFSA

+0

@JoaoFSA中的b.action。谢谢你的问题。你看,我需要找到这些记录,其中的行动是在200,201或202之后发生的。 104在这段时间内发生。 –

回答

0

你过滤小时,只有元素h.Action == 104和h2到只有i.Action == 200 || i.Action == 201 || i.Action == 202这是一个完全不同的一组与无h的元素的结果。

如果ImageId是你的主键(或任何其他独特的领域)加入2套不同的结果总是会导致空集

+0

'ImageId'不是我的主键。一个图像在一段时间范围内可能有不同的“操作”,这就是为什么我首先查询104,然后查询之前有104个查询的200,201,202。 –