Parent/Children Xml to DTO Object Model with LINQ

一曲冷凌霜 提交于 2019-11-28 02:28:16

Try this:

internal class OrderDetailCollection : List<OrderDetail>
{
    internal OrderDetailCollection() {}
    internal OrderDetailCollection(IEnumerable<OrderDetail> src)
    {
        AddRange(src);
    }
}

List<Order> lineItems = new List<Order>
(
    from list in xDoc.Descendants(ns + "orders")
    from item in list.Elements(ns + "order")
    where item != null
    select new Order
    {
        //note that the cast is simpler to write than the null check in your code
        //http://msdn.microsoft.com/en-us/library/bb387049.aspx
        OrderId = (string)item.Attribute("orderId"),
        OrderDetails = new OrderDetailCollection(
            from detail in item.Descendants("orderDetail")
            select new OrderDetail {
                ItemName = (string)detail.Attribute("itemName"),
                Quantity = (int)detail.Attribute("quantity")
            }
        )
     }
);

If you don't need separate classes for the collections, and can use List<Order> and List<OrderDetails> instead, then you can do this:

List<Order> lineItems = new List<Order>
(
    from list in xDoc.Descendants(ns + "orders")
    from item in list.Elements(ns + "order")
    where item != null
    select new Order
    {
        OrderId = (string)item.Attribute("orderId"),
        OrderDetails = (
            from detail in item.Descendants("orderDetail")
            select new OrderDetail {
                ItemName = (string)detail.Attribute("itemName"),
                Quantity = (int)detail.Attribute("quantity")
            }
        ).ToList()
     }
);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!