Это может быть опасно, если вам случится загрузить все рекурсивные объекты, особенно в категории, вы можете получить WAY больше, чем рассчитывали:
Category > Item > OrderLine > Item
OrderHeader > OrderLine > Item
> Item > ...
Внезапно вы загрузили большую часть своей базы данных, вы могли также загрузить строки счетов-фактур, затем клиентов, а затем все остальные их счета.
Что вы должны сделать, это что-то вроде следующего:
var qryCategories = from q in ctx.Categories
where q.Status == "Open"
select q;
foreach (Category cat in qryCategories) {
if (!cat.Items.IsLoaded)
cat.Items.Load();
// This will only load product groups "once" if need be.
if (!cat.ProductGroupReference.IsLoaded)
cat.ProductGroupReference.Load();
foreach (Item item in cat.Items) {
// product group and items are guaranteed
// to be loaded if you use them here.
}
}
Однако лучшим решением будет создание запроса для создания анонимного класса с результатами, поэтому вам нужно будет всего лишь один раз нажать на хранилище данных.
var qryCategories = from q in ctx.Categories
where q.Status == "Open"
select new {
Category = q,
ProductGroup = q.ProductGroup,
Items = q.Items
};
Таким образом, при необходимости вы можете вернуть результат словаря.
Помните, ваш контекст должен быть как можно более коротким.