【问题标题】:Loading multiple related table data into MVC view. (Linq to SQL)将多个相关表数据加载到 MVC 视图中。 (Linq 到 SQL)
【发布时间】:2013-04-29 07:08:16
【问题描述】:

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

【问题讨论】:

  • 我只使用导航属性(我假设您使用的是 EF)而不是显式连接... :)
  • 嗨@Trustme-I'maDoctor,我使用Linq to SQl 将数据库表映射到我的对象,所以我假设我没有使用EF。

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


【解决方案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()

【讨论】:

  • 您好 NinjaNye,感谢您的回复。不幸的是,我似乎无法访问 linq 的“包含”方法。这是因为我使用 linq to SQL,而不是 EF?
  • 查看这篇文章并使用LoadWithstackoverflow.com/a/5783252/611288 它应该给你同样的结果。您始终可以删除 .Include,因为它只是确保将相关数据带回一个查询中,这对于小型数据集可能不是问题
  • @gb1986 我已经更新了我的答案,给你第二个选择。
  • 对不断的问题表示歉意。我尝试添加您提供的代码,但是遇到了一些问题。特别是这一行: .Select(u => UserViewModel{ UserModel = u, Posts => u.Posts}) 我制作了一个 UserViewModel 模型,并有两个字段: public UserModel UserModel { get;放; } 公共 PostModel PostModel { 获取;放;但是,我现在收到与一行相关的多个错误。再次感谢您的帮助。
  • 投票。天哪,我不明白人们怎么会对投票如此吝啬。 +1 谢谢!
【解决方案2】:

NinjaNye 的回答是对的,但是需要在 viewmodel 调用之前有'new',像这样:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    相关资源
    最近更新 更多