1

私はLinqの初心者で、簡単な問題を解決するのに苦労しています..これまでにやったことがない.

シナリオは、 books..like を持つ単一の XML テーブルです。

<?xml version="1.0" encoding="utf-8"?>
<dbproject>
<books_dataset>
<book>
  <id>23</id>
  <isbn>075221912X</isbn>
  <title>Big Brother: The Unseen Story</title>
  <author>Jean Ritchie</author>
  <publicationYr>2000</publicationYr>
  <publisher>Pan Macmillan</publisher>
  <pages>169</pages>
  <imageBigLink>/images/P/075221912X.01.LZZZZZZZ.jpg</imageBigLink>
  <priceActual>0</priceActual>
  <numberOfBids>0</numberOfBids>
  <sf>kw</sf>
  <df></df>
  <ef></ef>
  <description>Lorem ipsum dolor sit amet</description>
</book>
</books_dataset>
</dbproject>

ノードに「kw」文字列を持つ次/前の書籍の ID (次の書籍/最初の書籍) を取得するクエリを作成しようとしています。

ID は連続しておらず、インデックスもありません。たとえば、次のボタンは次のように ID を探します。

  1. 次の(上位)ID = 次の本
  2. 「kw」文字列を含むもの

私は多くの解決策を試しましたが、混乱しました:/。

次/前のノードにジャンプできます..しかし、正直なところ、タスクを達成するための最良のアプローチではないと確信しています。

kw 文字列を持つ本をリストすることはできますが、この 2 つの要件は一緒には機能しません :/

このクエリを使用して、次の ID を要求します。

var btnNextEval = (from databack in xmlData.Element("dbproject").Elements(QRY).Elements(QRY_sub)
                           where databack.Element(fid1).Value == trgtCounter.ToString() 
                           select     databack).Single().ElementsAfterSelf().First().Element("id").Value;

trgtCounter = Convert.ToInt16(btnNextEval);

&& を使用して複数の場所を作成しようとしましたが、機能しませんでした:/

このばかげた問題の可能な解決策を教えてください。ありがとう!

4

1 に答える 1

0

これを試して:

var nextId = (
    from book in xmlData.Elements("book")
    let id = (int)book.Element("id")
    where ((string)book.Element("sf")) == "kw"
        && id > currentId
    select (int)book.Element("id")
).DefaultIfEmpty(-1).Min();

次の ID を返します。次の ID を持つ書籍を取得するには、次の手順を実行します。

var nextBook = (
    from book in xmlData.Elements("book")
    where (int)book.Element("id") == nextId
    select book
).First();

ノート:

  • これは、現在の ID を含むcurrentIdタイプの変数があることを前提としています。int
  • DefaultIfEmpty現在の ID より大きい ID がない場合に必要です。その場合、Minエラーが返されます。を使用DefaultIfEmpty(-1)すると、 を含む 1 つのセットが返され-1ます。
  • First は、空のシーケンスで使用された場合にもエラーを返します。
于 2012-11-18T16:36:01.397 に答える