2015-05-15 13 views
6

sto cercando di trovare tutti i messaggi in RavenDB contenenti una parola (indice è lì)Qual è la sintassi corretta per RavenDB Metodo di ricerca in F #

Ecco una query che funziona, trova tutto ciò che inizia con 'Liv'

let post = query { 
    for post in session.Query<MyType>() do 
    where (post.Text.StartsWith("Liv")) 
    select post 
} 

Un tentativo di utilizzare string.Contains() metodo come condizione di Where chiusura, getterà NotSupportedException. Here

Così sto cercando di utilizzare il metodo di ricerca dove:

Expression<Func<T, object>> fieldSelector, 
// Expression marking a field in which terms should be looked for. 

C# equivalenti da docs:

List<User> users = session 
    .Query<User>("Users/ByNameAndHobbies") 
    .Search(x => x.Name, "Adam") 
    .Search(x => x.Hobbies, "sport") 
    .ToList(); 

Il mio primo tentativo è stato quello di andare con

let x = session.Query<MyType>(index).Search((fun xe -> xe.Text), "Liv") 

Ma ottenendo l'errore bec ause aspetta l'oggetto. Ho cercato di String abbattuto a Object (che strana idea), ma ottenere:

Non riesco a capire come tradurre x => x.Invoke (xe)

Al momento, io sono fuori idee. Devo segnare il campo per la ricerca e restituire l'oggetto. Qualche idea?

Grazie.

MODIFICA 1: La mia espressione. Ottiene runtime InvalidCastException perché non può eseguire il cast della stringa su obj.

let expr = 
    <@ Func<MyType, _>(fun xe -> xe.Text) @> 
    |> LeafExpressionConverter.QuotationToExpression 
    |> unbox<System.Linq.Expressions.Expression<Func<MyType, _>>> 
+0

Sono ragionevolmente sicuro che 'x => x.Name' in' search' non è un 'Func ' 'ma Espressione >', in modo da o devi usare espressioni o quotazioni se c'è un'API compatibile con F # ... –

+0

Crea modifica. Il fatto è ... fun xe -> xe.Text restituisce una stringa perché Text è una stringa. Ma la funzione si aspetta obj. Downcasting non ha funzionato perché "Non riesco a capire come tradurre x => x.Invoke (xe.Text)". Sono molto sicuro di cosa significhi "segnare un campo" qui. – Dimka

+1

Un'opzione consiste nell'utilizzare l'API di query Lucene, che prende il nome della proprietà come una stringa. Correlati: http://stackoverflow.com/questions/24625040/search-query-in-ravendb – Jay

risposta

3

Lei ha detto che si è tentato di colata la string-object. Ho provato usando :> obj e funziona.

Ecco la mia domanda di lavoro:

let expr = <@ Func<MyType,_>(fun x -> x.Text :> obj) @> 
       |> LeafExpressionConverter.QuotationToExpression 
       |> unbox<Linq.Expressions.Expression<Func<MyType,_>>> 
let events = session.Query<MyType>() 
       .Search(expr, "Liv*", decimal 1, SearchOptions.Or, EscapeQueryOptions.AllowAllWildcards) 
       |> List.ofSeq 
+0

In realtà, ho eseguito un cast multi-linea e la mia versione genera eccezioni, ma la tua no.Divertente, dovrebbe essere lo stesso. Grazie per la risposta. <@ Func (fun x -> let xe = x.Text:> obj xe) @> – Dimka

Problemi correlati