【发布时间】: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 => x.Name不是Func<T,T1>而是Expression<Func<T,T1>>,因此如果有与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 最新版本)。