我正在使用代码优先方法使用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();
}
答案 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
的模型,则一切都应该有效。