使用Azure移动客户端的这两个LINQ查询之间的差异

时间:2016-04-06 02:00:26

标签: c# linq azure-mobile-services

所以我遇到了一段时间以来一直使用的LINQ查询问题,现在它似乎没有按预期工作。

messagesWithoutConditional =
                    await
                    MobileServiceInstance.GetSyncTable<Messages>()
                        .OrderByDescending(key => key.SentDate)
                        .Take(50)
                        .Where(
                            p =>
                            (p.Uuid == myUuid && p.RecipientUuid == otherUuid) ||
                            (p.Uuid == otherUuid && p.RecipientUuid == myUuid))
                        .ToListAsync();

所以我想说这个查询只返回两方之间发送的最后50条消息。现在,如果我想添加一个附加条件,即50条消息也应该在特定日期之前,我希望能做到这样的事情

messagesWithConditional =
                    await
                    MobileServiceInstance.GetSyncTable<Messages>()
                        .OrderByDescending(key => key.SentDate)
                        .Take(50)
                        .Where(
                            p =>
                            ((p.Uuid == myUuid && p.otherUuid == recipientUuid) ||
                            (p.Uuid == otherUuid && p.RecipientUuid == myUuid))
                              && p.SentDate < 'some date')
                        .ToListAsync();

让我们假设我应该期望这返回40条消息,但它会返回0.但是,如果我将查询替换为此

messagesWithConditional = messagesWithoutConditional.Where(p => p.SentDate < 'some date').ToList();

然后我将通过查询原始表达式的结果来收到40条预期的消息。

第二种方法与第一种方法有何不同?理想情况下,我想使用&&运算符添加新的条件表达式,而不是中断第二个where子句

修改

我还应该注意,时间是UTC格式,SentDate属性类型为DateTimeOffset

截至目前,它似乎是一个错误,除非做出其他一些见解。有关更多信息,请参阅bug报告

1 个答案:

答案 0 :(得分:2)

.Where应放在.OrderByDescending.Take(50)

之前