2015-05-15 31 views
6

我試圖找到RavenDB包含單詞的所有帖子(指數有)什麼是對RavenDB的搜索方法在F#的語法正確

這是一個可行的查詢,發現與「麗芙」開始一切

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

)使用string.Contains(方法,凡 倒閉,將引發NotSupportedException異常狀態的一種嘗試。 Here

所以我想使用的搜索方法,其中:

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

C#相當於從文檔:

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

我的第一次嘗試是去與

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

但得到錯誤因爲它期望反對。試圖垂頭喪氣字符串對象(有什麼奇怪的想法),但得到:

能不知道如何翻譯X => x.Invoke(XE)

此刻,我出想法。我應該標記字段進行搜索並返回對象。有任何想法嗎?

謝謝。編輯1: 我的表達。獲取運行時InvalidCastException,因爲它無法將字符串轉換爲obj。

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

我有理由相信,'X => x.Name'在'Search'不是'Func鍵''但表達>',所以你如果有F#兼容API,則必須使用表達式或引用... –

+0

已編輯。事情是... fun xe - > xe.Text返回字符串,因爲Text是字符串。但是函數需要obj。向下轉換不起作用,因爲「無法理解如何轉換x => x.Invoke(xe.Text)」。 我很不確定「標記一個字段」的真正含義。 – Dimka

+1

一種選擇是使用Lucene查詢API,它將屬性名稱作爲字符串。相關:http://stackoverflow.com/questions/24625040/search-query-in-ravendb – Jay

回答

3

你提到你嘗試鑄造stringobject。我嘗試使用:> obj,它確實有效。

這裏是我的工作查詢:

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

實際上,我做了一個多行轉換,我的版本拋出異常,但是你沒有。有趣的是,它應該是一樣的。謝謝你的答案。 <@ Func (fun x - > let xe = x.Text:> obj xe)@> – Dimka