2015-05-15 13 views
6

Ich versuche, alle Beiträge in RavenDB zu finden, ein Wort enthält (Index gibt es)Was für RavenDB Suchmethode in F # die korrekte Syntax ist

Hier ist eine Abfrage, die findet alles funktioniert, die mit ‚Liv‘ beginnt

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

Ein Versuch string.Contains zu verwenden() -Methode als Bedingung Wo Schließung, NotSupportedException werfen. Here

So versuche ich, Suchmethode zu verwenden, wo:

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

C# -Äquivalent von docs:

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

war mein erster Versuch, mit zu gehen

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

Aber Fehler bekommen Bec ause erwartet es object out. Versucht, gesenkten String zu Objekt (was für eine seltsame Idee), aber immer:

kann nicht verstehen, wie x übersetzen => x.Invoke (xe)

Im Moment, ich bin aus Ideen. Ich soll das Feld für die Suche markieren und das Objekt zurückgeben. Irgendwelche Ideen?

Vielen Dank.

EDIT 1: Mein Ausdruck. Ruft die Laufzeitangabe InvalidCastException ab, weil die Zeichenfolge nicht in obj umgewandelt werden kann.

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

ich ziemlich sicher bin, dass 'x => x.Name' in' Search' ist kein 'Func ' 'aber Expression >', so dass Sie entweder müssen Ausdrücke oder Zitate verwendet werden, wenn es F # kompatible API gibt ... –

+0

Gemacht redigieren. Die Sache ist ... Spaß xe -> xe.Text gibt String zurück, weil Text String ist. Aber die Funktion erwartet obj. Downcasting hat nicht funktioniert, weil "Kann nicht verstehen, wie x => x.Invoke (xe.Text) zu übersetzen". Ich bin mir sehr unsicher, was "ein Feld markieren" hier wirklich bedeutet. – Dimka

+1

Eine Option besteht darin, die Lucene-Abfrage-API zu verwenden, die den Eigenschaftsnamen als Zeichenfolge verwendet. Related: http://stackoverflow.com/questions/24625040/search-query-in-ravendb – Jay

Antwort

3

Sie haben erwähnt, dass Sie die string-object Gießen versucht. Ich habe es mit :> obj versucht und es funktioniert.

Hier ist mein Arbeits query:

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

Eigentlich habe ich eine Multi-Line-Besetzung gemacht und meine Version wirft eine Ausnahme, aber deine nicht.Lustig, es sollte das selbe sein. Danke für die Antwort. <@ Func (Spaß x -> lassen xe = x.Text:> obj xe) @> – Dimka

Verwandte Themen