2011-04-16 93 views
3

我有一個模型叫做,其中有一個字段叫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應該已經有了這樣的索引。

回答

3

嗯,我們實際上在AbstractIndexCreationTask中也使用了相同的約定,所以應該起作用。 無論如何,總是可以使用__document_id

+0

來訪問文檔的ID所以你也使用第二個選項,你認爲我創建Post_ByID是明智的,並且我必須在ID上創建索引郵政,密碼和其他一些領域。任何決定使用屬性(註解)將某個屬性標記爲ID並更改FindIdentityConvention的人將面臨同樣的問題,像Post_BySlug這樣的索引將不起作用。 – Zasz 2011-04-17 08:21:00