Я предполагаю, что между отчетами и комментариями существует 1-М ФК (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
Джон Скитс "C # в глубине" дает отличный обзор их, и я также слышал очень хорошие вещи о "Linq в действии" - плюс есть много постов в блоге об этих концепциях, которые делают темы более справедливыми, чем Я могу сделать здесь; о)