将多个相关表数据加载到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代码查询数据库是错误的,然而,我似乎不能认为我做错了什么。很抱歉这么长时间的问题,如果有任何帮助,我将不胜感激。
你看到的是正确的,因为你正在为每个帖子建立一个新的配置文件。
如果你只是想返回一个用户,你不应该加入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();