linq从2个表中获取sql geting数据

时间:2016-03-06 11:35:54

标签: c# entity-framework linq-to-sql asp.net-mvc-5

我试图使用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>

1 个答案:

答案 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运算符将结果集过滤成有意义的数据集合,这些数据足够合理,可以显示在单个视图中。