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

linq to sql geting data from 2 tables

我正在尝试使用 Linq 从 2 table 获取数据,那个 table 对第二个 table 有 FK 但不一定有数据 (table评论可能对每个评论评论(很多))我想得到的是:在一个视图中获取所有评论,如果有任何评论,则显示与评论​​ ID 相关的评论 尝试使用 join 在我的视图中出现错误(模型传递错误我尝试了每个 table 模型)这是我的代码:

     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>

一如既往,我会首先为此视图编写一个视图模型,其中包含我想显示的信息,并且永远不会像您在代码中那样将匿名对象发送到您的视图。

假设您要显示评论列表,并为每个评论显示相应评论的列表。所以你的视图模型可能看起来像这样:

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