我正在学习RavenDB而且我很困惑。据我所知,应该创建索引以获得真正有效的查询。但是,可以简单地进行LINQ查询,例如
using(IDocumentSession session = _store.OpenSession())
{
MyDocument doc = session.Query<MyDocument>()
.Where(d => d.Property == value)
.Single();
}
这种类型的查询完全正常。但是,我从未为它创建过索引(当然,在进行查询时从不引用索引)。
使用RavenDB时,我应该使用这种查询吗?如果没有,为什么它甚至可以在API中使用?
答案 0 :(得分:8)
这里有两件事你在这里。
正如Matt Warren所说,你没有在样本查询中使用任何索引。现在,通过示例查询,RavenDb足够聪明,可以创建临时(动态)索引。如果足够使用该动态索引,则会将其自动提升为静态/卓越索引。
那么..你应该使用索引吗?如果可以,那么是啊!
这是你的陈述,这次是定义了一个索引。
using(IDocumentSession session = _store.OpenSession())
{
MyDocument doc = session.Query<MyDocument>("ByProperty")
.Where(d => d.Property == value)
.Single();
}
在这种情况下,在某处创建了一个名为MyDocument_ByProperty
的索引。我不打算解释索引的细节.. go and read all about them here。
(不确定这是否是正确的术语......)
如果使用OR创建一个linq语句(我在上面做过)而没有索引..仍然会生成一个查询...然后将其转换为对RavenDB服务器的HTTP RESTful请求。如果你有一个索引..那么查询足够聪明,可以要求使用它。没有?然后服务器将创建一个动态索引..这意味着它还必须首先完成索引的动作,然后检索你的结果。
是使用索引。是的,使用Linq链接。
答案 1 :(得分:5)
RavenDb附带.Net和Linq的原生支持。
Linq提供程序在ravendb服务器上执行正常的REST调用,但对于您来说,更容易对其进行编码,因为您可以将IQueryable<T>
用于强类型类。
所以,是的,您可以使用linq / lambda在.Net环境中使用RavenDB。
答案 2 :(得分:1)
引起我注意的一点是,如果你包含一个linq语句,如.Where(d =&gt; d.SomeProperty == null)那么你可能会期望如果文档没有属性那么你会回来一场比赛。然而,这种情况并非如此。如果文档没有该属性,则其值不被视为null(或任何其他值)。