Когда записи из связанных таблиц загружаются с помощью LINQ2SQL? - PullRequest
0 голосов
/ 11 декабря 2008

Допустим, у меня есть две таблицы:

  • Доклад
  • Комментарий

И при условии, что у меня есть контекст базы данных:

var reports = db.Reports();

Как я могу убедиться, что все комментарии для каждого отчета также загружены?

На данный момент я хочу отключиться от базы данных, но все же иметь доступ к комментариям. (Например:)

reports[0].Comments[0].Subject

Ответы [ 2 ]

1 голос
/ 11 декабря 2008

Имейте в виду, что если вы используете LoadOptions для определения многопрыжкового пути (отчеты, комментарии, анотерентность), 3-й и последующие прыжки загружаются (если они связаны с отношениями 1: n) кодом, который очень неэффективен: выполню один запрос на одного из родителей. Для отчетов-комментариев все в порядке, они будут получены в 2 запроса.

1 голос
/ 11 декабря 2008

Я предполагаю, что между отчетами и комментариями существует 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 в действии" - плюс есть много постов в блоге об этих концепциях, которые делают темы более справедливыми, чем Я могу сделать здесь; о)

...