私は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;
しかし、エラーが発生しますプロパティまたはフィールド 'OrderID'がタイプ 'XElement'に存在します(インデックス0)
これは私が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>
私は以下のクエリを使用しましたが、まだ運がありません
var query = document.Descendants("orders")
.OrderBy(String.Format("Element(\"{0}\").Value {1}", sortColumn, OrderDirection))
.Skip(lowerPageBoundary - 1 * rowsPerPage)
.Take(rowsPerPage);
エラーが発生する理由は、 XMLタグでは大文字と小文字が区別されるためです。
リンクからの抜粋(質問の例と一致するように変更):
XMLタグでは大文字と小文字が区別されます。タグ<Orders>は、タグ<orders>とは異なります。
クエリは存在しない要素 "orders"を検索しています。クエリを更新します。
XDocument document = XDocument.Load(xmlFilePath);
var query = document.Descendants("Orders").Select(c => c);
更新:
あなたのコメントに基づいて、エラーは実際にはIEnumerabe<XElement>
内の「OrderID」で注文しようとしたことが原因です。 「OrderID」は実際には各XElement
子要素です。
これについてさらに調査を行うと役立つでしょう。グーグル検索の助けを借りて、私の結果は、System.Linq.DynamicライブラリがXMLで使用するように設計されていないことを示しています。
OPが結論するこのSO質問を参照してください。
ようやく動作しました。現時点ではXmlでの使用を意図したものでさえないと確信しているため、元のアプローチを放棄しました。私はその声明に反論するためにどこにも投稿されたことはほとんどありません。
XMLをDataSetに読み込むのはどうですか?
DataSet dataSet = new DataSet();
dataSet.ReadXml(xmlFilePath);
string sort = sortColumn + " " + OrderDirection;
DataTable table = dataSet.Tables["Orders"].Select("", sort)
.Skip(lowerPageBoundary - 1 * rowsPerPage)
.Take(rowsPerPage)
.CopyToDataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;