RavenDB查询上ID

问题描述:

我有一个模型叫做,其中有一个字段叫S。我用属性[ID]标记了该字段,并在RavenDB中更改了FindIdentityProperty约定,使其将[ID]标记的属性视为文档的标识。RavenDB查询上ID

现在我想取有以字符摹开始蛞蝓的所有帖子,我需要创建这样一个指标:

from Post in docs.Posts 
select new { Slug = Post.Slug } 

或类似这样的

from Post in docs.Posts 
select new { Id = Post.Id } 

或做我使用RavenDB内部应该具有的索引,因为我正在查询ID。 我知道RavenDB的ID属性被编入索引,所以Session.Load<Post>("SomeID")是可能的。

第一个选项可以在C#中的代码中定义为AbstractIndexCreationTask,因为C#知道Slug是Post的一个字段,但不起作用,因为它是这样的字符串:(当创建索引时)

from Post in docs.Posts 
select new { Slug = Post.Slug } 

成为

docs.Posts 
    .Select(Post => new {Slug = Post.Slug }) 

你可以看到这个当您在SL-UI看,创建索引之后。

,这是否工作,因为(如图DB的SL-UI)后的JSON表示,没有名称 - 值对像"Slug":"Some-Slug"。由于它是其示出以上该文档的ID,并且在@metadata它可以被看作是值_document_id

后者的工作,但仅当在定义为一个字符串,象这样C#

public class Post_ById : AbstractIndexCreationTask 
    { 
     public override IndexDefinition CreateIndexDefinition() 
     { 
      return new IndexDefinition 
         { 
          Map = "from Post in docs.Posts select new { Id = Post.Id}" 
         }; 
     } 
    } 

我怀疑,当乌鸦得到包含字符串“标识”查询,它会自动它意味着它是在[@metadata] [_ DOCUMENT_ID]查询。

在这里没有LINQ的好处 - 看起来非常脆弱,将无法生存的域名重构。 Id不是Post的字段,但是这个索引确实允许我做我想做的事情,即“获取所有具有以字符G开头的slu posts的帖子”。我讨厌为DB定义索引,因为DB应该已经有了这样的索引。

嗯,我们实际上在AbstractIndexCreationTask中也使用了相同的约定,所以应该起作用。 无论如何,总是可以使用__document_id

+0

来访问文档的ID所以你也使用第二个选项,你认为我创建Post_ByID是明智的,并且我必须在ID上创建索引邮政,密码和其他一些领域。任何决定使用属性(注解)将某个属性标记为ID并更改FindIdentityConvention的人将面临同样的问题,像Post_BySlug这样的索引将不起作用。 – Zasz 2011-04-17 08:21:00