2016-04-06 16 views
0

Bir süredir kullanmakta olduğum bu LINQ sorgusuyla ilgili sorunlar yaşıyorum ve şimdi beklendiği gibi çalışmıyor gibi görünüyor.Azure mobil istemcisini kullanarak bu 2 LINQ sorguları arasındaki fark

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(); 

Yani, yalnızca 2 taraf arasında gönderilen son 50 iletiyi döndüren bu sorguya sahip olduğumu söyleyelim. Şimdi 50 mesajlar da bu

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(); 

böyle bir şey yapmak beklenir belirli bir tarihten önce olması gerektiğini ek koşul eklemek istiyorsanız ben 40 mesaj döndürmek için bu beklemeliyim varsayalım Lets, ancak 0 döndürür Bu

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

içine sorgu dönüşümlü eğer. Ancak, o zaman benim orijinal ifadenin sonucunu sorgulayarak 40 beklenen mesajlar alabilirsiniz.

İkinci yaklaşım ilkinden nasıl farklıdır? İdeal ben yeni koşullu ifade eklemek için && operatörünü kullanmak yerine ikinci bir where fıkra içine kopmak istiyorum

Düzenleme

Ben de saatler UTC olarak belirtilir dikkat etmelidir

ve SentDate nitelik Başka bir içgörü sağlanmadıkça, şu anda bir hata gibi görünmektedir.

+0

önce konulmalıdır fazla bilgi için bug raporuna bakınız aralarındaki tek fark ikincisi bellekte yapılacaktır ve diğer veritabanında yapılacaktır olmasıdır . Bu, veritabanının ve sunucunuzun farklı saat dilimlerinde çalıştığına inanmamı sağlar (ve 'bazı tarihleriniz' saat dilimi bilgilerinin eklenmiş değil) – Rob

+0

Bunu da ekleyerek bunu doğrulayabilirsiniz. Where (p => p.SentDate < 'bir tarih') 'ilk önce hemen sonra, fakat ToListAsync'den önce (aynı sonuçtaki maddeyle aynı sonuçları vermelidir) – Rob

+0

@Rob evet Bunu daha önce denedim ve aslında aynı sonucu aldım, yani , 0. Ancak, hala karşılık gelen bir UTC saati kullanıyorum, koşullu yaklaşımın neden çalışmadığından emin değilim. Örneğin, "messagesWithoutConditional" yapısında 'messagesDithoutConditional [9] .SentDate 'gibi kullanmak için' messagesDithoutConditional' yapısında rasgele bir orta nokta alıyorum, hala 0 sonuç aldım –

cevap

2

.Where.OrderByDescending ve .Take(50)

+0

Buna katılıyorum, bu doğru yaklaşım olmalı ve aslında normal masmavi tabloları kullanarak bu yaklaşım işe yarıyor. Ancak, SyncTables kullanıldığında sonuç beklendiği gibi değil. –