我似乎在将相关数据传递给我的视图时出现问题。我正在创建一个简单的博客,它有三个表的数据库架构。这些是用户,帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用Linq到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代码是错误的,但是,我似乎无法想象我做错了什么。很抱歉这个问题很长,任何帮助都会很感激。
答案 0 :(得分:1)
当您为每个帖子构建新的个人资料时,您看到的内容是正确的。
如果您只是想要退回一个用户,则不应该加入Post并在之后包含帖子数据。
var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
.Include(u => u.Posts)
.ToList()
然后,您可以在嵌套循环中读取每个用户,然后读取每个帖子。
更新:现在在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
}
}
最好为您的视图创建一个模型,而不是像我一样使用您的数据条。
更新:使用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()
答案 1 :(得分:1)
NinjaNye的答案是正确的,但它需要有新的&#39;在viewmodel调用之前,像这样:
var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId)
.Select(u => new UserViewModel{ UserModel = u, Posts => u.Posts })
.ToList();