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