0

私はlinqを初めて使用し、探しているデータをプルバックするクエリを作成するのに問題があります。xmlファイルには注文があり、各注文には発注情報と製品があり、各製品には独自の要素と子孫があります。すべての注文とその子孫を1つのコレクションにクエリする必要がありますが、何らかの理由で、linqクエリの構文は非常に直感的ではありません。

これが私のxmlの切り捨てられたサンプルです

<fulfillment>
   <orders>
      <order>
         <isbulk>true</isbulk> 
         <purchaseorder>
            <id>Acme Inustries</id> 
            <quantity>15</quantity> 
         </purchaseorder>
         <items>
            <item>
               <prods>
                  <prod>
                     <seq>1</seq> 
                     <issuetype>NEW</issuetype> 
                     <loop>
                        <proxy>xyz123</proxy> 
                        <servicecode>55</servicecode> 
                     </loop>
                  </prod>
                  <prod>
                     <seq>2</seq> 
                     <issuetype>NEW</issuetype> 
                     <loop>
                        <proxy>abc987</proxy> 
                        <servicecode>121</servicecode> 
                     </loop>
                  </prod>
               </prods>
            </item>
         </items>
      </order>
      <order>
         <isbulk>true</isbulk> 
         <purchaseorder>
            <id>ABC Co</id> 
            <quantity>10</quantity> 
         </purchaseorder>
         <items>
            <item>
               <prods>
                  <prod>
                     <seq>1</seq> 
                     <issuetype>NEW</issuetype> 
                     <loop>
                        <proxy>xyz456</proxy> 
                        <servicecode>998</servicecode> 
                     </loop>
                  </prod>
                  <prod>
                     <seq>2</seq> 
                     <issuetype>NEW</issuetype> 
                     <loop>
                        <proxy>abc654</proxy> 
                        <servicecode>664</servicecode> 
                     </loop>
                  </prod>
               </prods>
            </item>
         </items>
      </order>
   </orders>
</fulfillment>

私のオブジェクトは次のようになります。

public class order
{
    public bool IsBulk { get; set; }

    public PurchaseOrder PurchaseOrder = new PurchaseOrder();
    public List<prod> ListOfProds = new List<prod>();
}

public class prod
{
    public string Seq { get; set; }
    public string IssueType { get; set; }

    public string Proxy { get; set; }
    public string ServiceCode { get; set; }
}

public class PurchaseOrder
{
    public string ID { get; set; }
    public string Quantity { get; set; }
}

だから私は一日の大部分のクエリに取り組んできましたが、それを正しく理解できないようです。これが私がこれまでに得たものです:

List<order> orderlist = new List<order>();
XDocument xmlDoc = XDocument.Load(FilePath);

var list = (from myOrder in xmlDoc.Descendants("order")             
select new       
{
   linq_orderIsBulk = Convert.ToBoolean(myOrder.Element("isbulk").Value),

   linq_purchaseOrderID = myOrder.Element("purchaseorder").Element("id").Value,
   linq_purchaseOrderQuantity = myOrder.Element("purchaseorder").Element("quantity").Value,

   prodlist = myOrder.Element("items").Element("item").Element("prods").Elements("prod").Select(e => new
   {                
      Linq_seq = e.Element("seq").Value,
      Linq_IssueType = e.Element("issuetype").Value,

      Linq_proxy = e.Element("loop").Element("proxy").Value,
      Linq_serviceCode = e.Element("loop").Element("servicecode").Value
   }).ToList()
});

//リスト内のコレクションをリスト順序リストに入れるコードを実行します

しかし、これを行うと、「オブジェクト参照がオブジェクトのインスタンスに設定されていない」という結果になるようです。サブクエリでエラーが発生しました。Linq_proxy行とLinq_serviceCode行をコメントアウトすると、結果は得られますが、正しい結果は得られません。リストをループして1つの注文を取得し、その注文のprodlistを確認すると、カウントは、その注文の2ではなく、そのファイル(4)の製品の合計量になります。何かご意見は?

4

1 に答える 1

3

私はこれを実行しました、そしてそれはうまくいきます:

var orders = new List<order>(
    from myOrder in xmlDoc.Descendants("order")
    let purchaseOrder = myOrder.Element("purchaseorder")
    select new order {
        IsBulk = Convert.ToBoolean(myOrder.Element("isbulk").Value),
        PurchaseOrder = new PurchaseOrder {
            ID = purchaseOrder.Element("id").Value,
            Quantity = purchaseOrder.Element("quantity").Value
        },
        ListOfProds = new List<prod>(
            from product in myOrder.Descendants("prod")
            let loop = product.Element("loop")
            select new prod
            {                
                Seq = product.Element("seq").Value,
                IssueType = product.Element("issuetype").Value,
                Proxy = loop.Element("proxy").Value,
                ServiceCode = loop.Element("servicecode").Value
            }
        )
    }
);

コレクションを自分のタイプのオブジェクトに直接投影できるため、後で注文コレクションを作成するためのコードを用意する必要がないことに注意してください。

于 2012-08-02T17:11:16.387 に答える