Когда записи из связанных таблиц загружаются с помощью LINQ2SQL

StackOverflow https://stackoverflow.com/questions/358591

Вопрос

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

  • Отчет
  • Комментарий

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

var reports = db.Reports();

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

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

reports[0].Comments[0].Subject
Это было полезно?

Решение

Я предполагаю, что между отчетами и комментариями существует связь 1-M FK (один отчет может иметь много комментариев)?

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top