【问题标题】:What is the correct syntax for RavenDB Search method in F#F# 中 RavenDB 搜索方法的正确语法是什么
【发布时间】:2015-05-15 12:20:35
【问题描述】:

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

这是一个有效的查询,可以找到以“Liv”开头的所有内容

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

尝试使用 string.Contains() 方法作为 Where 的条件 关闭,将抛出 NotSupportedException。 Here

所以我正在尝试使用 Search 方法,其中:

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, _>>>

【问题讨论】:

  • 我有理由确定Search 中的x =&gt; x.Name 不是Func&lt;T,T1&gt; 而是Expression&lt;Func&lt;T,T1&gt;&gt;,因此如果有与F# 兼容的API,您必须使用表达式或引号...
  • 进行了编辑。事情是... fun xe -> xe.Text 正在返回字符串,因为 Text 是字符串。但该函数需要 obj。向下转换不起作用,因为“无法理解如何翻译 x => x.Invoke(xe.Text)”。我非常不确定“标记字段”在这里的真正含义。
  • 一种选择是使用 Lucene 查询 API,它将属性名称作为字符串。相关:stackoverflow.com/questions/24625040/search-query-in-ravendb
  • 讽刺的是,在 Ayende 写了一篇反对 F# 的博文之后,这个问题就被问到了:ayende.com/blog/170849/…
  • @Idsa 他有一个好点,他不是反对 F#,而是反对将 db 重写为 F#。我正在使用几个 C# 库没有任何问题,这就是 .Net 背后的想法。以任何语言编写并以任何其他 .Net 语言使用。但是,他们应该有连接和设置等基本内容的代码示例。我使用的示例来自 v1 或 smth(3.0 最新版本)。

标签: f# ravendb


【解决方案1】:

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

【讨论】:

  • 实际上,我进行了多行转换,我的版本抛出异常,但你的没有。有趣,应该是一样的。谢谢你的答案。 (fun x -> let xe = x.Text :> obj xe ) @>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多