F#

时间:2015-05-15 12:20:36

标签: f# ravendb

我正在尝试查找RavenDB中包含单词(索引在那里)的所有帖子

这是一个有效的查询,查找以' Liv'

开头的所有内容
let post = query {
    for post in session.Query<MyType>() do
    where (post.Text.StartsWith("Liv"))
    select post
}
  

尝试使用string.Contains()方法作为Where的条件   关闭,将抛出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")

但是因为它期望对象出错而得到错误。试图将String转换为Object(这是一个奇怪的想法),但得到:

  

无法理解如何翻译x =&gt; x.Invoke(XE)

目前,我没有想法。我应该为搜索和返回对象标记字段。有什么想法吗?

谢谢。

编辑1: 我的表情。获取运行时InvalidCastException,因为它无法将字符串转换为obj。

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

1 个答案:

答案 0 :(得分:3)

您提到您尝试将string转换为object。我使用:> 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