0

我似乎在将相关数据传递到我的视图时遇到问题。我正在创建一个简单的博客,它具有三个表的数据库架构。这些是用户、帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用 Linq to SQl 来创建我的数据库模型。这是我使用 Linq 传递数据的尝试:

public ActionResult NewProfile()
    {
        var users = from u in db.UserModels
                    join p in db.PostModels on u.UserId equals p.UserId
                    where u.UserId == WebSecurity.CurrentUserId
                    select new Profile { UserModel = u, PostModel = p };

        return View(users);
    }

这是接收视图中的代码:

@model IEnumerable<MvcBlog.Models.Profile>

@{
    ViewBag.Title = "NewProfile";
 }

 <h2>NewProfile</h2>

 @foreach (var item in Model)
 {
    @item.UserModel.Username
 }

在我告诉你结果是什么之前,我认为让你了解我的数据库中的数据很重要。目前,我只有三个用户。这些用户中只有一个 (gb201) 创建了任何博客文章。用户 gb201 一共创建了两篇博文。

当我运行程序并以用户 gb201 登录时,NewProfile 页面上显示的数据是:

New Profile

gb201
gb201

该视图正在从两个表中传递数据,但是,当我希望查询用户表时,它会根据该用户的帖子数复制数据。因此,如果用户只有一篇文章,那么它只会显示一次。对于其他两个没有发布任何内容的用户,此页面上没有显示任何信息。

我假设我查询数据库的 linq 代码是错误的,但是,我似乎想不出我做错了什么。抱歉,问题很长,任何帮助将不胜感激。

4

2 回答 2

1

当您为每个帖子建立一个新的个人资料时,您看到的内容是正确的。

如果您只想返回一个用户,则不应加入 Post 并在之后包含帖子数据。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                         .Include(u => u.Posts)
                         .ToList()

然后,您可以阅读每个用户,然后在嵌套循环中阅读每个帖子。

更新:现在在电脑

在你看来

@model IEnumerable<MvcBlog.Data.UserModel>

@{
    ViewBag.Title = "NewProfile";
 }

 <h2>NewProfile</h2>

 @foreach (var item in Model)
 {
    @item.Username

    //if you wanted the postes per user
    foreach(var post in user.Posts)
    {
        @post.Title
    }        
 }

为您的视图创建一个模型是一个很好的做法,而不是像我一样使用您的数据类。

更新:使用 Linq to SQL

以上将构建一个可以在视图中使用的视图模型。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                       //.Include(u => u.Posts)
                         .Select(u => UserViewModel{ UserModel = u, Posts => u.Posts})
                         .ToList()
于 2013-04-29T07:20:00.220 回答
1

NinjaNye 的答案是正确的,但它需要在 viewmodel 调用之前有“新”,如下所示:

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId)
                     .Select(u => new UserViewModel{ UserModel = u, Posts => u.Posts })
                     .ToList();
于 2015-10-27T12:18:50.580 回答