2017-01-26 6 views
0

こんにちは私は本の詳細を含むxmlを持っています。 xmlの構造は -Xmlの検索要素がidsのリストと一致しています

<Root> 
    <Books> 
     <Book> 
      <BookId>1</BookId> 
      <Title>Book 1</Title> 
      <LanguageId>1</LanguageId> 
      <Genres>2,3</Genres> 
      <BookType>1</BookType> 
      <Description>Lorem Ipsum</Description> 
     </Book> 
     <Book> 
      <BookId>3</BookId> 
      <Title>Book 3</Title> 
      <LanguageId>3</LanguageId> 
      <Genres>12,23</Genres> 
      <BookType>2</BookType> 
      <Description>Lorem Ipsum</Description> 
     </Book> 
     <Book> 
      <BookId>3</BookId> 
      <Title>Book 2</Title> 
      <LanguageId>2</LanguageId> 
      <Genres>1,13</Genres> 
      <BookType>2</BookType> 
      <Description>Lorem Ipsum</Description> 
     </Book> 
     <Book> 
      <BookId>4</BookId> 
      <Title>Book 4</Title> 
      <LanguageId>2</LanguageId> 
      <Genres>1,13</Genres> 
      <BookType>2</BookType> 
      <Description>Lorem Ipsum</Description> 
     </Book> 
    </Books> 
</Root> 

複数のジャンルIDを持つことができ、複数の言語を持つことができます。 私は、ジャンルID、言語のリスト、ブックタイプのリストを持っています。

ジャンルID、言語ID、ブックタイプがそのリストと一致するすべての書籍を取得したいと考えています。

私が望んでいたよう

List<XElement> elems = xldoc.Root.Descendants("Books") 
            .Descendants("Book") 
            .Where(x=> 
            (listofgenres.Contains(x.Element("GenreId").Value)) && 
            (listoflanguages.Contains(x.Element("LanguageId").Value)) && 
            (listofbooktypes.Contains(x.Element("BookType").Value))) 
            .ToList(); 

nodes-すべてのブックのXMLをループする。しかし、それは結果をフェッチしなかったことを、より効率的になるように私はこのためにLINQクエリを使用していました。私は間違って何をしていますか?

私は1,3,4,2のようなbookIdのリストを持っていて、これらのIDを持つリストを私のリストと同じ順序でフェッチしたいと思うのですが、linqが別の方法です。今では、すべてのXMLノードをループしてコレクションに追加することで、書籍を1つずつ取り出しています。

答えて

0

: 私はあなたのような何かをしたかったのだと思い

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml; 
using System.Xml.Linq; 



namespace ConsoleApplication43 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      List<int> order = new List<int>() { 1, 3, 4, 2 }; 
      XDocument doc = XDocument.Load(FILENAME); 

      List<XElement> books = doc.Descendants("Book").OrderBy(x => order.IndexOf((int)x.Element("BookId"))).ToList(); 
     } 
    } 

} 
+0

あなたのロジックは使用しましたが、すべてのブックノードを返しました。リスト order = new List (){1,3、};リスト books = xldoc.Root.Element( "Books")。 .OrderBy(x => bookids.IndexOf(int)x.Element( "BookId")))。ToList(); ' – Sonali

+1

次のコードを追加する必要があります。Where(x => order.Contains((int)x)要素( "BookId")) – jdweng

1

あなたのxmlにGenreIdはありません。 Genresというカンマ区切りのジャンルリストです。非常にシンプルな

List<XElement> elems = xldoc.Root.Descendants("Books") 
     .Descendants("Book") 
     .Where(x=> (listofgenres.Intersect(x.Element("Genres").Value.Split(',')).Any()) 
        && (listoflanguages.Contains(x.Element("LanguageId").Value)) 
        && (listofbooktypes.Contains(x.Element("BookType").Value))) 
     .ToList(); 
+0

うんジャンルはカンマ区切りとジャンルIDです。 – Sonali

+1

@ maksim-simkin演劇のコードhttps://dotnetfiddle.net/lwSjhc –

+0

@ThirueswaranRajagopalanありがとう。私はLInqPadのサムを持っていました。問題は、すべてのジャンルがlistofgenresになければならないと想定されています。 –

関連する問題