Когда записи из связанных таблиц загружаются с помощью LINQ2SQL
-
21-08-2019 - |
Вопрос
Допустим, у меня есть две таблицы:
- Отчет
- Комментарий
И если предположить, что у меня есть контекст базы данных:
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 запроса.