【问题标题】:Should I be using LINQ queries on RavenDB?我应该在 RavenDB 上使用 LINQ 查询吗?
【发布时间】:2011-12-06 09:55:00
【问题描述】:

我正在学习 RavenDB,我很困惑。据我了解,应该创建索引才能进行真正有效的查询。但是,可以简单地进行 LINQ 查询,例如

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

这种类型的查询工作得很好。但是,我从未为其创建索引(当然,在进行查询时也从未引用索引)。

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

【问题讨论】:

标签: c# linq ravendb


【解决方案1】:

这里有两个问题。

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

索引

正如 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 和链接

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

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

TL;DR;

是的,使用索引。是的,使用 Linq 链接。

【讨论】:

    【解决方案2】:

    RavenDb 自带对 .Net 和 Linq 的原生支持。

    在后台,Linq 提供程序对 ravendb 服务器进行正常的 REST 调用,但对您而言,在其上编写代码更容易,因为您可以将 IQueryable&lt;T&gt; 与强类型类一起使用。

    是的,您可以并且应该使用 linq/lambda 在 .Net 环境中使用 RavenDB。

    【讨论】:

    • 当然,LINQ 查询非常好,我想使用它们。但我想知道将它们与 RavenDB 和索引一起使用是否有意义(即与使用命名索引的查询相比,上述示例的性能如何)。
    • 当您通过 .net 数据提供程序(使用强类型类)将数据存储在 raven db 中时,raven db 会自动放置元数据并创建索引,因此当您查询相同类型时它会使用它们使用通用的 IQueryable 所以我会说性能是最好的。
    【解决方案3】:

    需要注意的一点是,如果您包含诸如 .Where(d => d.SomeProperty == null) 之类的 linq 语句,那么您可能会认为如果文档没有该属性,那么您将返回匹配项。然而,这种情况并非如此。如果文档没有该属性,则其值不被视为 null(或任何其他值)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 2020-10-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2010-09-10
      相关资源
      最近更新 更多