English 中文(简体)
相关表中的记录何时被载入LINQ2SQL?
原标题:
  • 时间:2008-12-11 06:42:34
  •  标签:

假设我有两张表:

  • 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
最佳回答

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

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

  • The deferred execution model of Linq and Linq To Sql (Basically, for Linq to SQL, the query only runs when the results are asked for e.g. by iterating over the collection or binding to a grid)
  • The difference between IQueryable and IEnumerable

Jon Skeets的《深入理解C#》对这些概念有很好的概述,我也听说过《Linq实战》非常不错-此外,有很多关于这些概念的博客文章,这些文章比我在这里能做得更好;o)

问题回答

请注意,如果您使用LoadOptions来定义多跳路径(报表,评论,另一个实体),则第三个和更多跳将通过非常低效的代码进行加载(如果通过1对n关系相关),它们将执行每个父级一个查询。对于报告-评论来说,这是可以的,它们将在2个查询中获取。





相关问题
热门标签