何时来自相关表的记录加载LINQ2SQL

时间:2008-12-11 06:42:34

标签: c# linq-to-sql database-relations loadoptions

假设我有两张桌子:

  • 报告
  • 注释

假设我有一个数据库上下文:

var reports = db.Reports();

如何确保每个报告的所有评论都已加载?

此时我想断开与数据库的连接,但仍然如此 有权访问评论。 (例如:)

reports[0].Comments[0].Subject

2 个答案:

答案 0 :(得分:1)

我假设报告和评论之间存在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
                    };

要了解查询何时运行以及数据库连接何时关闭,您需要了解:

  • Linq和Linq To Sql的延迟执行模型(基本上,对于Linq to SQL,查询仅在要求结果时运行,例如通过迭代集合或绑定到网格)
  • IQueryable和IEnumerable之间的区别

Jon Skeets“C#in depth”给出了很好的概述,我也听过很多关于“Linq in Action”的内容 - 此外还有很多关于这些概念的博客文章,这些内容比我可以在这里做; o)

答案 1 :(得分:1)

请记住,如果使用LoadOptions定义多跳路径(报告,注释,连贯性),则会通过非常低效的代码加载第3个和更多跳(如果与1:n关系相关):每个父母执行一次查询。对于报告 - 评论,没关系,它们将在2个查询中获取。