首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解如何访问列表中的嵌套列表时遇到问题

理解如何访问列表中的嵌套列表时遇到问题
EN

Stack Overflow用户
提问于 2019-07-10 14:17:23
回答 1查看 83关注 0票数 1

I处理一个soap响应,其中xml在项目中有一个采购订单,例如

代码语言:javascript
复制
<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>

我可以把这个放到一个参差不齐的列表中。我的类看起来像这样

代码语言:javascript
复制
    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填充了purchase order类

代码语言:javascript
复制
        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结构来实现以下目标。

代码语言:javascript
复制
WHID Supplier_ID POID SKU    Product_ID QtyOrdered
2    00          6    Shoe30 124064     6

我已经削减了上面的字段,只是为了让它更容易阅读。但目标是将所有行项目和采购订单标题详细信息放在一行上。

代码语言:javascript
复制
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))));
        }
    }
}

我知道我错过了这里的对象是如何工作的,所以寻找一些方向。

非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-11 03:28:29

您可以对数据进行预处理,使其扁平化(反规范化),然后将其传递给现有的WriteCSV,而不是在WriteCSV中处理它

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56964421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档