假设我有两张表:
- Report
- Comment
假设我拥有一个数据库上下文:
var reports = db.Reports();
我该如何确保每份报告的所有评论都被加载?
At this point I want to disconnect from the database but still have access to the comments. (For example:)
reports[0].Comments[0].Subject
假设我有两张表:
假设我拥有一个数据库上下文:
var reports = db.Reports();
我该如何确保每份报告的所有评论都被加载?
At this point I want to disconnect from the database but still have access to the comments. (For example:)
reports[0].Comments[0].Subject
我假定报告和评论之间存在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#》对这些概念有很好的概述,我也听说过《Linq实战》非常不错-此外,有很多关于这些概念的博客文章,这些文章比我在这里能做得更好;o)
请注意,如果您使用LoadOptions来定义多跳路径(报表,评论,另一个实体),则第三个和更多跳将通过非常低效的代码进行加载(如果通过1对n关系相关),它们将执行每个父级一个查询。对于报告-评论来说,这是可以的,它们将在2个查询中获取。