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

C# 将多个相关表数据加载到MVC视图中。(Linq到SQL),c#,linq,asp.net-mvc-4,C#,Linq,Asp.net Mvc 4,我似乎在向视图传递相关数据时遇到了问题。我正在创建一个简单的博客,它有一个由三个表组成的数据库体系结构。这些是用户、帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用LINQtoSQL创建了我的数据库模型。下面是我尝试使用Linq传递数据的过程: public ActionResult NewProfile() { var users = from u in db.UserModels

我似乎在向视图传递相关数据时遇到了问题。我正在创建一个简单的博客,它有一个由三个表组成的数据库体系结构。这些是用户、帖子和评论。对于我的用户配置文件页面,我希望将这些表中的所有数据传递到用户配置文件视图中。我使用LINQtoSQL创建了我的数据库模型。下面是我尝试使用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
 }
视图从两个表中传递数据,但是,当我希望查询用户表时,它会根据该用户的帖子数量复制数据。因此,如果用户只有一篇文章,那么它只会显示一次。对于其他两个没有发布任何内容的用户,此页面上没有显示任何信息


我假设我查询数据库的linq代码是错误的,但是,我似乎不知道我做错了什么。很抱歉提出了这么长的问题,任何帮助都将不胜感激。

您所看到的都是正确的,因为您正在为每篇文章构建一个新的配置文件

如果您只是希望返回一个用户,则不应加入Post并在之后包含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
    }        
 }

NinjaNye的答案是正确的,但在调用viewmodel之前需要有“new”,如下所示:

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

我只使用导航属性(我假设您使用的是EF),而不是显式连接…:)您好@Trustme-I'maDoctor,我使用Linq to SQl将数据库表映射到我的对象,所以我假设我没有使用EF。您好NinjaNye,谢谢您的回复。不幸的是,我似乎无法访问linq的“Include”方法。这是因为我使用LINQtoSQL而不是EF吗?请参阅本文并使用
LoadWith
。它应该给你同样的结果。您始终可以删除
.Include
,因为它只是确保在一个查询中返回相关数据,这对于小数据来说可能不是问题sets@gb1986我已经更新了我的答案,给你第二个选择。为不断的问题道歉。我尝试添加您提供的代码,但是遇到了一些问题。具体来说,这一行:.Select(u=>UserViewModel{UserModel=u,Posts=>u.Posts})我创建了一个UserViewModel模型,有两个字段:public UserModel UserModel{get;set;}public PostModel PostModel{get;set;}但是,我现在得到了与这一行相关的多个错误。再次感谢你的帮助。投票给人们。天哪,我不明白人们怎么会对选票这么吝啬+谢谢你!
var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                       //.Include(u => u.Posts)
                         .Select(u => UserViewModel{ UserModel = u, Posts => u.Posts})
                         .ToList()
var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId)
                     .Select(u => new UserViewModel{ UserModel = u, Posts => u.Posts })
                     .ToList();