Linq - Стремительная загрузка EntitySet / EntityRef для дочерних объектов - загружается только 1 уровень? - PullRequest
1 голос
/ 17 июня 2011

Я не уверен, как обойти эту проблему linq to SQL, которая у меня есть.Свойства дочернего объекта в моем графе объектов загружаются не так, как я ожидал.

Мой код доступа к данным инкапсулирован в слой модели, поэтому загрузка полного графа объекта должна быть завершена до того, как объект будетвозвращено.

Я использую следующий код для заполнения графа объектов.

"Счет-фактура" является целевым объектом здесь.У него есть родительский объект «Порядок» и дочерние объекты «InvoiceItems».

Здесь загружается все, кроме «OrderItems», которые являются прямым потомком «Order», но также отображаются на «InvoiceItems».Доступ к ним осуществляется посредством ссылки на «InvoiceItems» в этом контексте.

Это очевидно, потому что «OrderItems» находятся на двух уровнях от объекта «Invoice», доступ к которому осуществляется через Invoice.InvoiceItems.OrderItem, где другие свойства, указанные в параметрах загрузки, отображаются непосредственно в Invoice.

Как загрузить объекты на 2 уровня от целевого объекта?

Надеюсь, это имеет смысл.

using (var dc = new ProjDataContext(Config.ConnectionStringERPDB))
            {
                if (loadObjectGraph)
                {
                    var loadOptions = new DataLoadOptions();

                    loadOptions.LoadWith<Invoice>(x => x.InvoiceItem);
                    loadOptions.LoadWith<Invoice>(x => x.Order);
                    loadOptions.LoadWith<InvoiceItem>(x => x.OrderItem);
                    loadOptions.LoadWith<OrderItem>(x => x.Product);

                    dc.LoadOptions = loadOptions;
                }

                Invoice invoice = (from c in dc.Invoice
                                   where c.ID == invoiceID
                                   select c).FirstOrDefault();

                return invoice;
            }

1 Ответ

2 голосов
/ 17 июня 2011

Похоже, вы не можете загрузить более одного уровня из другой информации, которую я с тех пор нашел.

Я добавил довольно грязный дополнительный фрагмент кода, чтобы заполнить свойства, к которым мне нужно получить доступ.

Это, вероятно, не очень хорошее решение - любой ввод приветствуется!

// Стремительная загрузка работает только для одного уровня

            // http://stackoverflow.com/questions/1191331/using-linq-to-sql-how-do-i-eager-load-all-child-and-any-nested-children-results
            // http://www.lowendahl.net/showShout.aspx?id=190

            if (loadObjectGraph)
            {
                foreach (InvoiceItem invoiceItem in invoice.InvoiceItem)
                {
                    var ii = invoiceItem;

                    OrderItem oiList = (from oi in dc.OrderItem
                                        where oi.ID == ii.OrderItemID
                                        select oi).FirstOrDefault();

                    invoiceItem.OrderItem = oiList;
                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...