Linq - Eager在子对象上加载EntitySet / EntityRef - 只有1级可加载?

时间:2011-06-17 10:52:41

标签: linq linq-to-sql

我不知道如何解决这个linq to SQL问题。我的对象图中的子对象的属性没有像我期望的那样加载。

我的数据访问代码封装在模型层中,因此需要在返回对象之前完成对完整对象图的加载。

我使用以下代码填充对象图。

“Invoice”是此处的目标对象。它有一个父对象“Order”和子对象“InvoiceItems”。

除了“OrderItems”之外,其他所有内容都加载,“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 个答案:

答案 0 :(得分:2)

您似乎无法从我找到的其他信息中加载多个级别。

我添加了一段非常脏的额外代码来填充我需要访问的属性。

这可能不是一个很好的解决方案 - 欢迎任何投入!

//渴望加载abover仅适用于一个级别

            // 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;
                }
            }