2016-04-06 6 views
0

私はしばらく使用していたこのLINQクエリに問題があり、現在は期待どおりに動作していないようです。Azureモバイルクライアントを使用したこれらの2つの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(); 

これで、2人の間で送信された最後の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の期待されるメッセージを受信します。

2番目のアプローチは最初のアプローチとどのように異なるのですか?理想的には私は、新しい条件式を追加する&&演算子を使うのではなく二where句に折れるたい

編集

私も時間がUTCであることに注意してください

、およびSentDate属性タイプがDateTimeOffset

現在、他の洞察がなされていない限り、バグのようです。

+0

の前に配置する必要があります詳細についてはbugレポートを参照してください、それらの間の唯一の違いは、第1のメモリ内で行われます、そしてもう一方はデータベース内で行われるということです。これにより、データベースとあなたのサーバーが異なるタイムゾーンで動作していると考えられます。また、 'some date'にはタイムゾーン情報がありません。 – Rob

+0

これを確認するには、 '.Where(p => p.SentDate < 'ToListAsync'の前のどこかの直後(同じwhere句内の条件と同じ結果を返さなければならない) – Rob

+0

@Robはい、私は前にそれを試していましたが、実際には同じ結果が得られました。しかし、なぜ私はまだ対応するUTC時間を使用している場合、条件付きのアプローチがうまくいかないのか分かりません。例えば、 'messagesWithoutConditional'構造体でランダムな中間点をとり、' SentDate'として 'messagesWithoutConditional [9] .SentDate'のように使用すると、私はまだ0の結果を受け取ります。 –

答えて

2

.Where.OrderByDescending.Take(50)

+0

これは正しいアプローチでなければならないと私は同意しますが、実際には正式な紺碧のテーブルを使用すると、このアプローチはうまくいきます。しかし、 'SyncTables'を使用した場合、結果は期待通りではありません –

関連する問題