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

时间:2013-04-29 07:08:16

标签: c# linq asp.net-mvc-4

我似乎在将相关数据传递给我的视图时出现问题。我正在创建一个简单的博客,它有三个表的数据库架构。这些是用户,帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用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代码是错误的,但是,我似乎无法想象我做错了什么。很抱歉这个问题很长,任何帮助都会很感激。

2 个答案:

答案 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();