将多个相关表数据加载到MVC视图中.(Linq to SQL)

本文关键字:视图 Linq to SQL MVC 加载 数据 | 更新日期: 2023-09-27 18:11:12

我似乎有一个问题传递相关数据到我的视图。我正在创建一个简单的博客,它有一个由三个表组成的数据库架构。这些是用户、帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用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代码查询数据库是错误的,然而,我似乎不能认为我做错了什么。很抱歉这么长时间的问题,如果有任何帮助,我将不胜感激。

将多个相关表数据加载到MVC视图中.(Linq to SQL)

你看到的是正确的,因为你正在为每个帖子建立一个新的配置文件。

如果你只是想返回一个用户,你不应该加入Post,然后包含Post数据。

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

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

UPDATE: Now at pc

在你的视图

@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
    }        
 }

为你的视图创建一个模型,而不是像我一样使用你的数据类,这将是一个很好的实践。

上面的代码将构建一个视图模型,您可以在视图中使用它。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                       //.Include(u => u.Posts)
                         .Select(u => UserViewModel{ UserModel = u, Posts => u.Posts})
                         .ToList()

NinjaNye的答案是正确的,但是它需要在视图模型调用之前有'new',像这样:

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId)
                     .Select(u => new UserViewModel{ UserModel = u, Posts => u.Posts })
                     .ToList();