我试图使用Linq从2个表中获取数据,一个表有FK到第二个表但没有必要有数据(表审查可能有每个评论评论(很多))我'我试图得到的是:在一个视图中获取所有评论,如果有任何评论显示它们与评论ID相关 试图在我的视图中使用join get me error(模型传递错误,我尝试了每个表模型)这是我的代码:
public ActionResult ttt()
{
var model = from rev in db.reviews
join com in db.Comments
on rev.ReviewId equals com.ReviewId into JoineRevCom
from com in JoineRevCom.DefaultIfEmpty()
select new
{
rev.ReviewBody,
rev.ReviewHeadLine,
Comments = com != null ? com.CommentBody : null
};
return View(model);
}
@model IEnumerable< SiteMvcPro.Models.Review>
答案 0 :(得分:2)
与往常一样,我首先要为此视图编写一个视图模型,其中包含我想要显示的信息,并且永远不会像在代码中那样将匿名对象发送到视图中。
假设您要显示评论列表,并且每个评论都要显示相应评论的列表。所以你的视图模型可能看起来像这样:
public class ReviewViewModel
{
public int ReviewId { get; set; }
public string ReviewBody { get; set; }
public string ReviewHeadLine { get; set; }
public IList<CommentViewModel> Comments { get; set; }
}
public class CommentViewModel
{
public string CommentBody { get; set; }
}
使用此定义,您可以执行LINQ查询以将必要的数据和项目提取到此视图模型:
IEnumerable<ReviewViewModel> viewModel =
from review in db.reviews
join comment in db.Comments
on review.ReviewId equals comment.ReviewId into joinedReviewComment
select new ReviewViewModel // <-- Always project to a view model and never to an anonymous object
{
review.ReviewBody,
review.ReviewHeadLine,
Comments = joinedReviewComment.Select(c => new CommentViewModel
{
CommentBody = c.CommentBody,
}).ToList(),
};
return View(viewModel.ToList()); // <-- Always pass a view model to your view
现在剩下的就是在强类型视图中显示此信息:
@model IList<ReviewViewModel>
<table>
<thead>
<tr>
<th>Review id</th>
<th>Review body</th>
<th>Review headline</th>
<th>Review comments</th>
</tr>
</thead>
<tbody>
@for (var i = 0; i < Model.Count; i++)
{
<tr>
<td>@Html.DisplayFor(x => x[i].ReviewId)</td>
<td>@Html.DisplayFor(x => x[i].ReviewBody)</td>
<td>@Html.DisplayFor(x => x[i].ReviewHeadLine)</td>
<td>
@for (var j = 0; j < Model[i].Comments.Count; j++)
{
<div>
@Html.DisplayFor(x => x[i].Comments[j].CommentBody)
</div>
}
</td>
</tr>
}
</tbody>
</table>
这就是说投影是一回事,但过滤你的数据是另一回事。假设您有数百万条评论,每条评论都有数百万条评论。进行上述查询只会让您的服务器快速下降。所以在设计应用程序和视图时要考虑这一点。不要犹豫,使用Where,Skip和Take运算符将结果集过滤成有意义的数据集合,这些数据足够合理,可以显示在单个视图中。