2012-01-02 6 views
6

Próbuję użyć ToUpperInvariant() w zapytaniu LINQ z RavenDB. Otrzymuję InvalidOperationException:Niepoprawna operacja RavenDB Linq .ToUpperInvariant()

nie może zrozumieć, w jaki sposób tłumaczyć server.Name.ToUpperInvariant().

Zapytanie znajduje się poniżej. Co musi się wydarzyć, aby móc dopasować tutaj nazwę? Czy jest to możliwe w zapytaniu za pomocą RavenDB?

public ApplicationServer GetByName(string serverName) 
{ 
    return QuerySingleResultAndCacheEtag(session => session.Query<ApplicationServer>() 
     .Where(server => server.Name.ToUpperInvariant() == serverName.ToUpperInvariant()).FirstOrDefault()) 
     as ApplicationServer; 
} 

protected static EntityBase QuerySingleResultAndCacheEtag(Func<IDocumentSession, EntityBase> func) 
{ 
    if (func == null) { throw new ArgumentNullException("func"); } 

    using (IDocumentSession session = Database.OpenSession()) 
    { 
     EntityBase entity = func.Invoke(session); 
     if (entity == null) { return null; } 
     CacheEtag(entity, session); 
     return entity; 
    } 
} 

Odpowiedz

8

Jak stwierdza wyjątku, serwer nie rozumie ToUpperInvariant(). O ile mi wiadomo, RavenDB używa niestandardowego LowerCaseKeywordAnalyzer, więc domyślnie zapytania nie uwzględniają wielkości liter. See the RavenDB documentation on analyzers, aby uzyskać więcej informacji.

+0

OK, fajnie, próbowałem porównać, konwertując na duże litery, a to nie było nawet konieczne. Po prostu wypróbowałem to bez konwersji i działało. Dziękuję Ci! –

+0

Dziękujemy! Próbowałem zrobić to samo; w ogóle o tym nie wiedziałem. Doh. – Darryl

+0

Spodziewał się również zachowania "porównywania języka programowania" i wpadł na ten sam problem. Sądzę, że powinienem był się spodziewać porównania typu "Baza danych jak", które zazwyczaj domyślnie ignoruje przypadek. Dzięki! –