2013-04-08 88 views
0

我正在使用RavenDb開發事件管理器。登錄的用戶可以在後面的地方寫一篇文章,然後查看用戶牆(主頁)中的所有文章。每篇文章都可以標記爲「喜歡」和「收藏」。像Twitter或Facebook這樣的小型結構。RavenDb - 從ID列表中獲取列表

這是最好的方式來獲得我所關注的地方的帖子?我需要獲得喜歡和收藏夾的數量,如果我已經在viewmodel上標記發送到視圖並顯示列表。我想這樣,但拋出最大請求異常。

  var myPlaces = this.SessionDb.Query<EventFollow>() 
       .Where(ls => ls.UserId == User.Identity.Name) 
       .Select(l => l.PlaceId); 

      var listPosts = this.SessionDb 
       .Advanced.LuceneQuery<Post>().WhereIn("PlaceId", myPlaces) 
       .Skip(skip) 
       .Take(20) 
       .ToList(); 


      List<PostViewModel> posts = new List<SpottedViewModel>(); 

      foreach (var p in listPosts) 

      { 
       PostViewModel vm = new PostViewModel(); 

       vm.Creator = p.UserCreatorId == User.Identity.Name; 

       vm.Like = this.SessionDb.Query<Lol>().Where(lol => lol.SpottedId == p.Id).Count(); 

       vm.Favourites = this.SessionDb.Query<Favourite>().Where(fa => fa.SpottedId == p.Id).Count(); 

       vm.Post= s; 

       vm.IsLike = this.SessionDb.Query<Like>().FirstOrDefault(l => l.PostId == p.Id) != null; 

       vm.IsFavourite = this.SessionDb.Query<Favourite>().FirstOrDefault(f => f.SpottedId == s.Id) != null; 


       posts.Add(vm); 
      } 

我有這些模型:

public class Post 
{ 
    public string Id { get; set; } 
    public string UtenteCreatorId { get; set; } 
    public string PlaceId { get; set; } 
    public string Body{ get; set; } 
} 

public class Lol 
{ 
    public string Id { get; set; } 

    public string PostId { get; set; } 

    public string UserId { get; set; } 
} 

public class Place 
{ 
    public string Id { get; set; } 

    public string UserCreatorId { get; set; } 

    public string Name{ get; set; } 
} 

public class Favourite 
{ 
    public string Id { get; set; } 

    public string PostId { get; set; } 

    public string UserId { get; set; } 
} 

public class EventFollow 
{ 
    public string Id { get; set; } 

    public string PlaceId { get; set; } 

    public string UserId { get; set; } 
} 

謝謝你,對不起,我的英語! ; D

回答

0

這裏的問題並不是真的從ID列表中獲取文檔列表,您可以通過使用IDocumentSession.Load方法併發送文檔ID列表或使用WhereIn你做。問題在於你的模型設計。

在我看來,你有一些認真的重新設計你的數據模型。它看起來和現在是強相關的,而RavenDB不是關係型的(或者對關係模型進行優化)。我很難看清楚你的用例是什麼,但從我所看到的,我可能會在'post'模型中保存'favorite'和'likes',並將'EventFollow'放入'用戶'模型中。

此外,根據RavenDB的"safe by default"原則,每個會話僅限30個請求(默認情況下,它是可配置的)。你有一些select N+1在這裏,所以你很可能會超過這30個請求。這就是爲什麼你會得到例外。

+0

是的,但是在RavenDb Group(Google),一位專家對我說,這個數據模型比先前(比如你的)要好很多,喜歡或者喜歡 – Stefano 2013-04-10 15:25:46

+0

這對我來說是令人驚訝的。你有鏈接到這個討論? – 2013-04-11 07:03:52

+0

https://groups.google.com/forum/#!topic/ravendb/vclQkOKBjJU – Stefano 2013-04-14 11:03:07