私はしばらく使用していたこの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
現在、他の洞察がなされていない限り、バグのようです。
の前に配置する必要があります詳細についてはbugレポートを参照してください、それらの間の唯一の違いは、第1のメモリ内で行われます、そしてもう一方はデータベース内で行われるということです。これにより、データベースとあなたのサーバーが異なるタイムゾーンで動作していると考えられます。また、 'some date'にはタイムゾーン情報がありません。 – Rob
これを確認するには、 '.Where(p => p.SentDate < 'ToListAsync'の前のどこかの直後(同じwhere句内の条件と同じ結果を返さなければならない) – Rob
@Robはい、私は前にそれを試していましたが、実際には同じ結果が得られました。しかし、なぜ私はまだ対応するUTC時間を使用している場合、条件付きのアプローチがうまくいかないのか分かりません。例えば、 'messagesWithoutConditional'構造体でランダムな中間点をとり、' SentDate'として 'messagesWithoutConditional [9] .SentDate'のように使用すると、私はまだ0の結果を受け取ります。 –