2013-03-05 46 views
3

即使是最簡單的查詢,我也無法查詢RavenDB,可能我做錯了什麼,但幾個小時後我再也看不到了。我GOOGLE了幾乎所有的東西我能想到的..如何使用Raven LoadDocument

我有這些實體:

public class User 
    { 
    public string Id { get; set; } 
    public string DisplayName { get; set; } 
    public string RealName { get; set; } 
    public string Email { get; set; } 
    public string PictureUri { get; set; } 
    public List<Comment> Comments { get; set; } 

    public List<Role> Roles { get; set; } 
} 

public class NewsItem 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public DateTime Created { get; set; } 
    public string UserId { get; set; } 
    public List<Tag> Tags { get; set; } 
    public List<Comment> Comments { get; set; } 
    public List<WebImage> Images { get; set; } 
} 

我要查詢這些,所以我得到newsItems的列表,但沿着它的用戶信息。所以,我閱讀文檔,並試圖LoadDocument功能,索引:

public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result> 
{ 

    public class Result 
    { 
     public string AuthorName { get; set; } 
    } 

    public NewsItemIndexWithComments() 
    { 
     Map = newsItems => from newsItem in newsItems 
          select new 
          { 
           AuthorName = LoadDocument<User>(newsItem.UserId).DisplayName 
          }; 
    } 
} 

對此我嘗試使用這樣的:

var result = _documentSession.Query<NewsItemIndexWithComments.Result, NewsItemIndexWithComments>().AsProjection<NewsItemIndexWithComments.Result>().ToList(); 

現在,我得到的我的列表中的文件數量,但AUTHORNAME是始終爲空。如果我不使用AsProjection方法,我不會得到任何結果。任何人都可以給我一個適當的例子,我可以進一步試驗嗎?

謝謝。

_編輯:

幫助很大,謝謝:)現在的第二步,我很抱歉,如果我是一個有點newbish,但你必須從某個地方開始。在newsitems中有評論,在這些評論中還有另外一個關於userid的參考。您大概可以猜到我想要做什麼:我也想要評論的用戶信息以及評論。

新指數:

public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result> 
{ 

    public class Result : NewsItem 
    { 
     public string AuthorName { get; set; } 
     public string AuthorId { get; set; } 

    } 

    public NewsItemIndexWithComments() 
    { 
     Map = newsItems => from newsItem in newsItems 
          let user = LoadDocument<User>(newsItem.UserId) 
          select new 
          { 
           AuthorName = user.DisplayName, 
           AuthorId = user.Id, 
          }; 
     Store(x => x.AuthorName, FieldStorage.Yes); 
     Store(x => x.AuthorId, FieldStorage.Yes); 
    } 
} 

評論類:

public class Comment 
{ 
    public string Id { get; set; } 
    public string Text { get; set; } 
    public string UserId { get; set; } 
    public string User { get; set; } 
    public DateTime Created { get; set; } 
} 

我如何可以查詢的評論和擴大的結果嗎?或者,僅僅爲評論創建一個新索引並獲得上述解決方案的用戶信息模擬效果會更好?

回答

4

你幾乎在那裏,你只需要存儲你投射的領域。將此添加到地圖之後的索引構造函數中。

Store(x=> x.AuthorName, FieldStorage.Yes); 

這是因爲您希望它返回並可用於AsProjection查找。如果您只是想在某個地方或orderby中使用作者姓名,則不需要它。

+0

這幫助!現在至少我得到了結果。但是這給我留下了另一個問題(請參閱編輯)。感謝您的幫助:) – neographikal 2013-03-06 08:48:46

+0

我對你的對象模型有點困惑。你在'User'和'NewsItem'類中嵌入了評論對象,但在你的Comment類中也有一個'Id'。是在他們自己的文件中的評論,還是其他文件的一部分?他們現在擁有它的方式在兩個地方都是非規範化的。你確定你不是故意有一個'List CommentIds'?另外 - 這裏有兩種不同類型的評論嗎?關於NewsItem的評論和關於用戶的評論?或者你只是試圖表明這些評論是由特定的用戶做出的? – 2013-03-06 13:10:45

+0

呃,我的不好,根本不應該在用戶課上有任何評論。愚蠢的我,我是這麼洗牌的代碼,我省略了這個錯誤。對困惑感到抱歉。 – neographikal 2013-03-06 17:51:05

0

因爲這是loaddocument ravendb的熱門搜索結果,我決定回答這些問題。

如果你只是想在你的AsProjection中包含註釋,你可以簡單地索引整個對象。

請注意,對自定義對象建立索引意味着您無法使用.Where()對其進行查詢。 RavenDB只能查詢平展結果(整數,小數點,字符串,日期)。

爲了例如查詢標題,您需要創建一個單獨的屬性public string Title { get; set; }並將其與Title = newsItem.Title對應。

public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result> 
{ 
public class Result : NewsItem 
{ 
    public string AuthorName { get; set; } 
    public string AuthorId { get; set; } 
    public List<Comment> Comments { get; set; } 

} 

public NewsItemIndexWithComments() 
{ 
    Map = newsItems => from newsItem in newsItems 
         let user = LoadDocument<User>(newsItem.UserId) 
         select new 
         { 
          AuthorName = user.DisplayName, 
          AuthorId = user.Id, 
          Comments = newsItem.Comments. 
         }; 
    Store(x => x.AuthorName, FieldStorage.Yes); 
    Store(x => x.AuthorId, FieldStorage.Yes); 
    Store(x => x.Comments, FieldStorage.Yes); 
} 

}