1

我是 Linq 的新手,很难解决一个简单的问题……因为我以前从未做过。

该场景是一个带有书籍的单个 XML 表..like :

<?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>

我正在尝试创建一个查询,它为我提供下一本/上一本书的 ID(下一本/第一本),该书在节点中有一个“kw”字符串。

ID 不连续,也没有索引。因此,例如,下一个按钮正在查找 ID,如下所示:

  1. 下一(更高)ID = 下一本书
  2. 其中有一个“kw”字符串

我尝试了很多解决方案,但只是感到困惑:/。

我能够跳到下一个/上一个节点.. 但老实说,我确信这不是完成任务的最佳方法。

我可以列出具有 kw 字符串的书籍,但这两个要求不能一起使用:/

我使用这个查询来询问下一个 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);

我尝试使用 && 创建多个 where 但没有工作:/

请帮助并向我展示这个愚蠢问题的可能解决方案。谢谢!

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();

笔记:

  • 这假设有一个包含当前 idcurrentId的类型变量。int
  • 如果DefaultIfEmpty没有比当前 ID 更大的 ID,则需要。在这种情况下,Min将返回错误。UsingDefaultIfEmpty(-1)将返回一个带有-1.
  • 如果在空序列上使用 First 也会返回错误。
于 2012-11-18T16:36:01.397 回答