2011-02-24 6 views
7

Kullanıcıların sitemize girebilmesi için girişleri doğrulamak üzere Raven'i kullanıyoruz.Raven (Sadece) ile sorgulamak sadece ilk 128 belgeye karşı filtreler mi?

// Context is an IDocumentSession 
Context.Query<UserModels>() 
      .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); 

Sorgu yalnızca Raven dokümanların ilk 128 dokümanlar üzerinde filtreler: saptadığımız Ne

bunu yaparsanız olmasıdır. Veritabanımızda birkaç bin tane var, bu yüzden e-postanız ilk 128'de gerçekleşmediği sürece, şansınız kalmadı. Raven numuneleri kodu veya ben net rastlamak olduğunuz tüm örnek kod

Yok herhangi Skip (kullanarak döngü) ve seti arasında yineleme() atın gerçekleştirir.

  1. Bu, Raven'ın istenilen davranışı mı?
  2. Gelişmiş bir Lucene Sorgusu kullansanız bile aynı davranıştır mı? örneğin; Gelişmiş sorgular farklı davranır mı?
  3. Aşağıdaki çözüm uygun mu? Biraz çirkin görünüyor. : P

Benim çözümüm, null bir sonuçla karşılaşıncaya kadar tüm belgeler kümesi arasında döngü yapmak, sonra ben kırmak ve geri dönmek.

public T SingleWithIndex(string indexName, Func<T, bool> where) 
{ 
    var pageIndex = 1; 
    const int pageSize = 1024; 
    RavenQueryStatistics stats; 

var queryResults = Context.Query<T>(indexName) 
    .Statistics(out stats) 
    .Customize(x => x.WaitForNonStaleResults()) 
    .Take(pageSize) 
    .Where(where).SingleOrDefault(); 

if (queryResults == null && stats.TotalResults > pageSize) 
{ 
    for (var i = 0; i < (stats.TotalResults/(pageIndex * pageSize)); i++) 
    { 
     queryResults = Context.Query<T>(indexName) 
      .Statistics(out stats) 
      .Customize(x => x.WaitForNonStaleResults()) 
      .Skip(pageIndex * pageSize) 
      .Take(pageSize) 
      .Where(where).SingleOrDefault(); 

     if (queryResults != null) break; 

     pageIndex++; 
    } 

} 

return queryResults; 

}

DÜZENLEME: Aşağıdaki düzeltmenin kullanarak

benim RavenDB örneğine sorgu params iletmiyor. Henüz neden olmadığından emin değilim.

Context.Query<UserModels>() 
    .Where(u => u.Email == email) 
    .SingleOrDefault(); 

Sonunda linq sorguları yerine Advanced Lucene Syntax kullanıyorum ve işler beklendiği gibi çalışıyor.

cevap

4

RavenDB, SingleOrDefault değerini anlamıyor, bu nedenle filtre olmadan bir sorgu gerçekleştirir. Durumunuz daha sonra sonuç kümesinde yürütülür, ancak varsayılan olarak Raven yalnızca ilk 128 belgeyi döndürür. Bunun yerine, bu yüzden filtreleme RavenDB/Lucene tarafından yapılır

Context.Query<UserModels>() 
     .Where(u => u.Email == email) 
     .SingleOrDefault(); 

aramak zorunda.

+0

Bunu google grubuna gönderdim ve Ayende henüz SingleOrDefault() 'da bir yüklemeyi desteklemediklerini belirtti. Sorunum, linq sorgulama sunucum için bir sorgu parametresi geçirmiyor çıkıyor. –