假设我有两张桌子:
- 报告
- 评论
并假设我有一个数据库上下文:
var reports = db.Reports();
如何确保每个报告的所有评论都已加载?
此时我想断开与数据库的连接,但仍然可以访问评论。(例如:)
reports[0].Comments[0].Subject
假设我有两张桌子:
并假设我有一个数据库上下文:
var reports = db.Reports();
如何确保每个报告的所有评论都已加载?
此时我想断开与数据库的连接,但仍然可以访问评论。(例如:)
reports[0].Comments[0].Subject
我假设报告和评论之间存在 1-M FK 关系(1 份报告可以有很多评论)?
一种选择是使用DataLoadOptions.LoadWith方法 - 如下所示:
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
现在,每次您选择有关该数据上下文的报告时,都会从数据库中获取评论。
请注意,将选择评论中的所有字段 - 无法使用此方法选择字段子集。
另一个选项是具体说明您要在 Linq 查询中选择的内容,例如
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
要了解查询何时运行以及数据库连接何时关闭,您需要了解:
Jon Skeets "C# in depth" 对这些进行了很好的概述,我也听说过关于 "Linq in Action" 的好消息——此外,还有很多关于这些概念的博客文章比我能做的更公正在这里;o)
请记住,如果您使用 LoadOptions 定义多跳路径(报告、评论、另一个实体),则通过代码加载第 3 跳和更远的跳(如果通过 1:n 关系相关)效率非常低:它们将执行每个父母一个查询。对于报告评论,没关系,它们将在 2 个查询中获取。