0

我正在用 RavenDb 开发一个事件管理器。登录的用户可以在后面的地方写一个帖子,然后在用户墙(主页)中查看所有帖子。每个帖子都可以标记为“喜欢”和“收藏”。像 twitter 或 facebook 这样的小结构。

通过我关注的地方获取帖子的最佳方式是什么?我需要获取喜欢和收藏的数量,如果我已经在 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

4

1 回答 1

0

您的问题并不是真正从 ID 列表中获取文档列表,您可以使用 IDocumentSession.Load 方法并发送文档 ID 列表,或者像您一样使用 WhereIn。问题是您的模型设计。

在我看来,您需要对数据模型进行一些认真的重新设计。它看起来像现在一样具有很强的关系,而且 RavenDB 不是关系的(或者无论如何都针对关系模型进行了优化)。我很难确切地看到您的用例是什么,但据我所知,我可能会在“发布”模型中保存“收藏夹”和“喜欢”,并将“EventFollow”放在“用户”模型中。

此外,根据 RavenDB 的“默认安全”原则,每个会话限制为 30 个请求(默认情况下,它是可配置的)。你有一些选择 N+1在这里进行,所以到目前为止你很可能会超过这 30 个请求。这就是你得到例外的原因。

于 2013-04-10T08:35:58.160 回答