我正在读取一个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存在。这是屏幕截图。
告诉我我在代码中犯了什么错误。请指导。感谢
答案 0 :(得分:1)
什么是sortColumn
和OrderDirection
?根据用法,它看起来像是字符串,但除非您使用动态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
。