开发者

Linq - Eager Loading of EntitySet / EntityRef on Child Objects - Only 1 Level Loadable?

I'm not sure how to work around this linq to SQL issue that I have. Properties of a child object in my object graph is not loading as I would expect.

My data access code is encapsulated in a model layer, so the loading of a full object graph needs to be completed before an object is returned.

I use the following code to populate the object graph.

The "Invoice" is the target object here. It has a parent object "Order" and child objects "InvoiceItems".

Everything loads here except for the "OrderItems", which are a direct child of "Order", but are also mapped to "InvoiceItems". They are accessed by reference to the "InvoiceItems" in this context.

This is apparently because the "OrderItems" are two levels away from the "Invoice" object, being accessed via Invoice.InvoiceItems.OrderItem, where as other properties specified in load options map directly to the Invoice.

How do I load objects 2 levels away from the target object?

I hope this makes sense.

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

                    loadOptions.LoadWith<Invoice>(x => x.InvoiceIte开发者_Go百科m);
                    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;
            }


It seems you can't load more than one level from other information I've since found.

I've added a pretty dirty extra piece of code to populate the properties I need to access.

This probably isn't a great solution - any input welcome!

// Eager loading abover only works for one level

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜