如何使用代码优先方法显示来自多个表的数据

时间:2011-12-16 07:38:54

标签: c# asp.net-mvc-3

我正在使用代码优先方法使用SQL Server显示来自多个表的数据。对于我的C#学期项目,我正在建立一个社交网站。在我的索引视图中,我想显示来自两个表的数据,即来自帖子和评论。

我正在尝试很多,但我的索引动作中没有任何内容。

首先,我正在使用它,但后来我认为它只执行表之间的简单连接。

public ActionResult Index()
{
    var myobj = DB.Comments.Include("Post").ToList();
    return View(myobj);
}

如果我在Index操作中使用下面的SQL查询而不是上面的SQL查询并将它们传递给视图,则会生成异常。我该如何避免?

public ActionResult Index()
{
     var myobj = from u in DB.Posts
                     join b in DB.Comments
                     on u.UserID equals b.UserID
                     into obj
                     from ua in obj.DefaultIfEmpty()
                     select new { userComments = (ua == null) ? "" : ua.UserComments, UserPosts = u.UserPosts };

     return View(myobj);
 }

在Index.cshtml里面我使用强类型视图:

@model IEnumerable<myApp.Models.DB.Comment>

然后使用foreach循环显示所有帖子和评论。

但它只显示那些postID出现在Comments表中的帖子(post中的外键在注释表中)。

我如何显示所有帖子及其评论(如果有的话)?


我正在使用.edmx文件作为后端,而从数据库中检索/添加数据我正在使用代码优先的方法。

这是一个代码示例:

private SocialNetworkingEntities net = new SocialNetworkingEntities();

    public void Add(RegisterView user)
    {
        DB.UserInfo User = new DB.UserInfo();
        User.Name = user.UserName;
        User.Password = user.UserPassword;
        User.Email = user.UserEmail;
        User.Birthday = user.UserDOB;
        User.Sex = user.UserSex;
        net.UserInfoes.Add(User);
        net.SaveChanges();
    }

2 个答案:

答案 0 :(得分:1)

如果您要显示包含可选评论的帖子,则Post而不是Comment是您的主要型号类型。此外,您不必像在第二种方法中那样手动连接表格 - 这是由EF自动完成的。

首先使用您的第一个approch的模式并更改它以返回帖子。您可以通过导航属性(帖子)访问评论:

public ActionResult Index()
{
    var allPosts = DB.Posts.Include("Comments").ToList();
    return View(allPosts);
} 

其次,将视图中的模型类型更改为Post

@model IEnumerable<myApp.Models.DB.Post>

现在您应该能够枚举所有帖子并选择评论:

@foreach (Post post in Model) {
    // display post
    foreach (Comment comment in post.Comments) {
        // display comment
    }
}

答案 1 :(得分:0)

第二种方法的问题是您的View期望一个Comment类型的ViewModel。但是,如果查看查询,则返回匿名类型而不是注释。

在第一个查询中,您将从“评论”开始并加载评论的所有帖子。这样你就不会得到没有任何评论的帖子。

我认为最简单的方法是定义从帖子到评论的关联,并将您的查询更改为:

var myobj = DB.Posts.Include("Comments").ToList();

如果您随后修改视图以接受类型为Post的模型,则一切都应该有效。