“XElement”类型中没有属性或字段“OrderID”(在索引0处)

时间:2015-07-21 15:09:59

标签: c# linq linq-to-xml dynamic-linq

我正在读取一个xml文件并通过以下方式查询LINQ

XDocument document = XDocument.Load(xmlFilePath);
var query = document.Descendants("orders").Select(c => c);
query = query.OrderBy(sortColumn + " " + OrderDirection);

query = query.Skip(lowerPageBoundary - 1 * rowsPerPage).Take(rowsPerPage);

DataTable table = query.ToList().ConvertToDataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
//adapter.Fill(table);
return table;

但是收到错误“XElement”类型(索引0处)中没有属性或字段“OrderID”

这是我的样本xml,我正在查询LINQ

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Orders>
    <OrderID>10248</OrderID>
    <CustomerID>VINET</CustomerID>
    <EmployeeID>5</EmployeeID>
    <OrderDate>1996-07-04T00:00:00</OrderDate>
    <RequiredDate>1996-08-01T00:00:00</RequiredDate>
    <ShippedDate>1996-07-16T00:00:00</ShippedDate>
    <ShipVia>3</ShipVia>
    <Freight>32.3800</Freight>
    <ShipName>Vins et alcools Chevalier</ShipName>
    <ShipAddress>59 rue de l'Abbaye</ShipAddress>
    <ShipCity>Reims</ShipCity>
    <ShipPostalCode>51100</ShipPostalCode>
    <ShipCountry>France</ShipCountry>
  </Orders>
</Root>

在调试模式下,我展开结果视图,发现订单ID存在。这是屏幕截图。 enter image description here

告诉我我在代码中犯了什么错误。请指导。感谢

1 个答案:

答案 0 :(得分:1)

什么是sortColumnOrderDirection?根据用法,它看起来像是字符串,但除非您使用动态LINQ,否则OrderBy不会接受字符串。

LINQ to XML没有为Elements提供属性。如果您有XElement e,则无法拨打e.OrderID。您必须使用此Element之类的e.Element("OrderID").Value方法。要将其插入OrderBy方法,您可以这样做:

query = query.OrderBy(e => e.Element("OrderID").Value);

正如评论所指出的那样,添加.Select(c => c)并没有做任何事情。此外,您可以链接其余方法,如下所示:

var query = document.Descendants("orders")
                    .OrderBy(e => e.Element("OrderID").Value)
                    .Skip(lowerPageBoundary - 1 * rowsPerPage)
                    .Take(rowsPerPage);

使用Dynamic LINQ,您仍然需要使用Element方法。 Dynamic Linq to Xml example表明它应该是这样的,但我没有测试过它:

var query = document.Descendants("orders")
                    .OrderBy(String.Format("Element(\"{0}\").Value {1}", sortColumn, OrderDirection))
                    .Skip(lowerPageBoundary - 1 * rowsPerPage)
                    .Take(rowsPerPage);

应该可以不使用Dynamic LINQ,因为您必须使用Element方法并传入您要排序的列的名称。当OrderByDescending“降序”时,您只需要分支并使用OrderDirection