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