Проблемы с пониманием того, как получить доступ к вложенному списку в списке - PullRequest
1 голос
/ 10 июля 2019

Я обрабатываю мыльный ответ, в котором у xml есть заказ на покупку внутри товаров например,

<PurchaseOrder>
<WHID>2</WHID>
<Supplier_ID>00</Supplier_ID>
<POID>6</POID>
<CreateDate>2013-01-02T10:48:27.37+11:00</CreateDate>
<CurrencyName>Australian Dollars</CurrencyName>
<ShippingStatus>Departed</ShippingStatus>
<payment_terms></payment_terms>
<shipping_terms></shipping_terms>
<POStatus>Back-Order</POStatus>
<PurchaseOrderItems>
<PurchaseOrderItem>
<SKU>Shoe30</SKU>
<Product_ID>124064</Product_ID>
<QtyOrdered>9</QtyOrdered>
<QtyOutstanding>6</QtyOutstanding>
<BuyPriceEx>20.0000</BuyPriceEx>
<DirectCosts>0.0000</DirectCosts>
<SupplierBuyPrice>20.0000</SupplierBuyPrice>
</PurchaseOrderItem>
</PurchaseOrderItems>
</PurchaseOrder>

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

    public class PurchaseOrder
    {
        public string WHID { get; set; }
        public string Supplier_ID { get; set; }
        public string POID { get; set; }
        public string CreateDate { get; set; }
        public string CurrencyName { get; set; }
        public string ShippingStatus { get; set; }
        public string payment_terms { get; set; }
        public string shipping_terms { get; set; }
        public string POStatus { get; set; }
        public List<PurchaseOrderItems> PurchaseOrderItems { get; set; }
    }
    public class PurchaseOrderItems
    {
        public string SKU { get; set; }
        public string Product_ID { get; set; }
        public string QtyOrdered { get; set; }
        public string QtyOutstanding { get; set; }
        public string BuyPriceEx { get; set; }
        public string DirectCosts { get; set; }
        public string SupplierBuyPrice { get; set; }

    }

Я заполняю класс заказа на покупку, используя следующую строку linq

        List<PurchaseOrder> _orderDetailed = items.Select(po => new PurchaseOrder()
        {
            WHID = (string)po.Element("WHID").ElementValueNull(),
            Supplier_ID = (string)po.Element("Supplier_ID").ElementValueNull(),
            POID = (string)po.Element("POID").ElementValueNull(),
            CreateDate = (string)po.Element("CreateDate").ElementValueNull(),
            CurrencyName = (string)po.Element("CurrencyName").ElementValueNull(),
            payment_terms = (string)po.Element("payment_terms").ElementValueNull(),
            shipping_terms = (string)po.Element("shipping_terms").ElementValueNull(),
            POStatus = (string)po.Element("POStatus").ElementValueNull(),
            PurchaseOrderItems = po.Descendants("PurchaseOrderItem").Select(i => new PurchaseOrderItems()
            {
                SKU = (string)i.Element("SKU").ElementValueNull(),
                Product_ID = (string)i.Element("Product_ID").ElementValueNull(),
                QtyOrdered = (string)i.Element("QtyOrdered").ElementValueNull()
            }).ToList()

        }).ToList();

Проблема возникает, когда я передаю это функции отражения, которая записывает объект в csv. в файл записываются только поля PurchaseOrder. Я понятия не имею, как получить доступ к полям PurchaseOrderItems, чтобы я мог записать их в файл.

Мне нужно добиться следующего, используя приведенную выше структуру xml.

WHID Supplier_ID POID SKU    Product_ID QtyOrdered
2    00          6    Shoe30 124064     6

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

public void WriteCSV<T>(IEnumerable<T> items, string path)
{
    Type itemType = typeof(T);
    var props = itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance)
                        .OrderBy(p => p.Name);

    using (var writer = new StreamWriter(path))
    {
        writer.WriteLine(string.Join(fieldDelimiter, props.Select(p => p.Name)));

        foreach (var item in items)
        {
            writer.WriteLine(string.Join(fieldDelimiter, props.Select(p => p.GetValue(item, null))));
        }
    }
}

Я знаю, что мне не хватает, как здесь работают объекты, поэтому ищу какое-то направление.

Очень ценится.

1 Ответ

2 голосов
/ 10 июля 2019

Вместо обработки в WriteCSV, вы можете предварительно обработать данные, чтобы сгладить (денормализовать) их, а затем передать их существующим WriteCSV:

var flatten = l.SelectMany(po => po.PurchaseOrderItems.Select(pi => new {
    po.WHID,
    po.Supplier_ID,
    po.POID,
    pi.SKU,
    pi.Product_ID,
    pi.QtyOrdered,
}));

WriteCSV(flatten);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...