2012-11-16 3 views
1

나는 Linq의 초보자이며 쉬운 프로 우를 해결하는 데 어려움이 있습니다. 전에 한 번도 해보지 않았으므로.이전/다음 버튼을 제공하기 위해 여러 문장을 기반으로하는 linq 쿼리 xxx

시나리오는 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> 

내가 나에게 이전/다음 책의 ID (다음 일/첫 번째)를 제공하는 쿼리를 작성하려고하는 노드에 "kw"문자열이 있습니다.

ID가 연속되지 않고 색인이 없습니다.

  1. 다음 (이상) ID = 다음 책에게 내가 '

에서 "kw"문자열을 가지고

  • 을 많이 해봤 다음과 같이 그래서 예를 들면 다음 버튼은 ID를 찾고 있습니다 솔루션을 사용했지만 혼란 스러웠습니다 : /.

    저는 다음/이전 노드로 이동할 수 있습니다.하지만 솔직히 말해서이 작업을 수행하는 최선의 방법은 아니라고 확신합니다.

    은 내가 kw 문자열이있는 책 목록을 할 수 있어요하지만,이 두 가지 요구 사항은 함께 작동하지 않습니다

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

    내가 시도를 :/

    내가 다음 ID를 요청하기 위해이 쿼리를 사용하여/

    도움이 저에게이 바보 문제에 대한 가능한 해결책을 제시해주십시오 :하지만 작동하지 않았다 복수를 만들 & &를 사용합니다. 감사합니다.

  • 답변

    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를 반환합니다.

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

    참고 : 다음 ID로 책을 얻으려면, 다음을 수행

    • 이 현재의 ID를 포함하는 유형 int의 변수 currentId이 가정합니다.
    • 현재 ID보다 큰 ID가없는 경우를 대비하여 DefaultIfEmpty이 필요합니다. 이 경우 Min은 오류를 반환합니다. DefaultIfEmpty(-1)을 사용하면 -1과 함께 단일 세트가 반환됩니다.
    • 빈 시퀀스에서 사용하면 오류가 반환됩니다.