【问题标题】:No property or field 'OrderID' exists in type 'XElement' (at index 0)“XElement”类型中不存在属性或字段“OrderID”(在索引 0 处)
【发布时间】:2015-07-21 15:09:59
【问题描述】:

我正在读取一个 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”

这是我通过 LINQ 查询的示例 xml

<?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 存在。这是屏幕截图。

所以告诉我我在哪里犯了代码错误。请指导。谢谢

【问题讨论】:

  • 你为什么有.Select(c =&gt; c)?这没有任何作用......

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


【解决方案1】:

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

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

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

正如评论指出的那样,添加 .Select(c =&gt; c) 不会做任何事情。此外,您可以像这样链接其余方法:

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

使用动态 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);

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

【讨论】:

  • 动态 LINQ。用于对来自 xml 的数据进行排序和排序。所以我使用下面的代码排序列名和排序顺序作为参数传递给函数。 query = query.OrderBy("OrderID"+ " " + "DESC");因此,请提供适用于 Dynamic LINQ 的代码。我的情况就像排序列和顺序可以是任何东西,这就是为什么我使用动态 LINQ 来处理这种情况,因为只有在动态 LINQ 的帮助下,我们才能在 OrderByFunction 中编写文本。
  • 我正在使用动态 LINQ。所以想知道你上面的代码是否适用于动态 LINQ。在你上面的代码中,我可以传递排序列名和排序顺序。让我知道。谢谢
  • 感谢您的回答。你说It should be possible without using Dynamic LINQ 你介意展示如何在没有动态 LINQ 的情况下处理这种情况。谢谢
  • 当我运行你的最后一个使用动态 linq 的代码时,我收到一个错误“'XElement' 类型中不存在适用的方法'Element'”你能帮我修复它吗?
  • XElement 确实有 Element 方法,所以这可能是 Dynamic LINQ 中的一个错误,或者它只是不支持这样做。我的前 2 个示例是如何在不使用动态 LINQ 版本的情况下使用标准 OrderBy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2014-07-15
相关资源
最近更新 更多