【问题标题】:When are records from related tables loaded with LINQ2SQL何时使用 LINQ2SQL 加载相关表中的记录
【发布时间】:2010-09-26 09:27:02
【问题描述】:

假设我有两张桌子:

  • 报告
  • 评论

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

var reports = db.Reports();

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

此时我想断开与数据库的连接,但仍然 可以访问 cmets。 (例如:)

reports[0].Comments[0].Subject

【问题讨论】:

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


    【解决方案1】:

    请记住,如果您使用 LoadOptions 定义多跳路径(报告、cmets、anotherentity),则第 3 跳和更远的跳(如果通过 1:n 关系相关)由非常低效的代码加载:它们'将为每个父级执行一个查询。对于报告-cmets,没关系,它们将在 2 个查询中获取。

    【讨论】:

      【解决方案2】:

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

      现在,每次您选择有关该数据上下文的报告时,都会从数据库中获取 cmets。

      请注意,将选择来自 cmets 的所有字段 - 无法使用此方法选择字段子集。

      另一个选项是具体说明您要在 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)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多