Скажем, у меня есть две таблицы:
И если у меня есть контекст базы данных:
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
};
Чтобы понять, когда запускается запрос и закрывается соединение с базой данных, вам необходимо понять:
Джон Скитс «Подробно о C#» дает отличный обзор этого, и я также слышал очень хорошие вещи о «Linq в действии» - плюс есть множество сообщений в блогах об этих концепциях, которые делают предметы более справедливыми, чем я здесь; о)
Имейте в виду, что если вы используете LoadOptions для определения многозвенного пути (отчеты, комментарии, прочее), третий и последующие переходы загружаются (если связаны отношениями 1: n) с помощью кода, который очень неэффективен: они будут выполняться один запрос на каждого родителя. Для отчетов-комментариев это нормально, они будут получены в 2-х запросах.