我应该在RavenDB上使用LINQ查询吗?

时间:2011-12-06 09:55:01

标签: c# linq ravendb

我正在学习RavenDB而且我很困惑。据我所知,应该创建索引以获得真正有效的查询。但是,可以简单地进行LINQ查询,例如

using(IDocumentSession session = _store.OpenSession())
{
    MyDocument doc = session.Query<MyDocument>()
                            .Where(d => d.Property == value)
                            .Single();
}

这种类型的查询完全正常。但是,我从未为它创建过索引(当然,在进行查询时从不引用索引)。

使用RavenDB时,我应该使用这种查询吗?如果没有,为什么它甚至可以在API中使用?

3 个答案:

答案 0 :(得分:8)

这里有两件事你在这里。

  1. 我们可以使用索引..假设比动态查询更有效吗?
  2. 如果我们使用索引..那么我们应该使用Linq和链接吗?
  3. 索引

    正如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

    Linq和chaining

    (不确定这是否是正确的术语......)

    如果使用OR创建一个linq语句(我在上面做过)而没有索引..仍然会生成一个查询...然后将其转换为对RavenDB服务器的HTTP RESTful请求。如果你有一个索引..那么查询足够聪明,可以要求使用它。没有?然后服务器将创建一个动态索引..这意味着它还必须首先完成索引的动作,然后检索你的结果。

    TL; DR;

    是使用索引。是的,使用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(或任何其他值)。