我是 linq 的新手,我在编写一个查询来拉回我正在寻找的数据时遇到了麻烦。xml 文件有订单,每个订单都有采购订单信息和产品,每个产品都有自己的元素和后代。我需要将所有订单及其后代查询到一个集合中,但由于某种原因,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()
});
//执行代码将列表中的集合放入List orderlist
但是当我这样做时,我似乎最终得到一个“对象引用未设置为对象的实例”。子查询错误。当我注释掉 Linq_proxy 和 Linq_serviceCode 行时,我得到了结果,但不是正确的。当我遍历列表并获取一个订单然后查看该订单的 prodlist 时,计数是该文件的 prods 总数 (4) 而不是该订单的 2 个。有什么想法吗?