2013-04-12 53 views
0

返回XML塊,我有以下XML刪除,並從相同的LINQ查詢

<Books> 
    <Book> 
     <Name>Let Us C</Name> 
     <Price>250</Price> 
     <ID>234</ID> 
    </Book> 
    <Book> 
     <Name>Da Vinci Code</Name> 
     <Price>500</Price> 
     <ID>38</ID> 
    </Book> 

    <Book> 
     <Name>Data Structures through C++</Name> 
     <Price>250</Price> 
     <ID>234</ID> 
    </Book> 


</Books> 

我需要與給定的ID(比如234)刪除所有的書籍,也是LINQ查詢應該返回我的ID和已刪除書籍的名稱作爲keyValue對。是否可以使用相同的LINQ查詢完成?

我寫了以下內容以刪除ID爲38的書。但是我無法獲取ID和名稱,而無需再次迭代它。

var idsToRemove = new List<int>{{38}}; 
XDocument xmlDoc = XDocument.Load("sample.xml"); 

xmlDoc.Descendants("Book") 
       .Where(
        Book => 
        (Book.Element("ID") != null 
        && idsToRemove.Contains(Convert.ToInt32((string) Book.Element("ID").Value)))).Select(Book => Book).Remove(); 

編輯1:

代碼選擇爲給定的簿ID的鍵值對。

var result = xmlDoc.Descendants("Book") 
       .Where(
        Book => 
        (Book.Element("ID") != null 
        && idsToRemove.Contains(Convert.ToInt32((string) Book.Element("ID").Value)))).Select(Book => new KeyValuePair<int,string>(Convert.ToInt32(Book.Element("ID").Value),(string)Book.Element("Name"))); 

我如何用一個單一的LINQ查詢

回答

1

爲什麼不保存查詢的結果,該變量執行Remove合併兩者兼而有之?

var booksToRemove = 
    xmlDoc.Descendants("Book") 
      .Where(Book => 
       (Book.Element("ID") != null && 
       idsToRemove.Contains(Convert.ToInt32((string)Book.Element("ID").Value)))) 
      .ToArray(); 

booksToRemove.Remove(); 

var removedBooks = booksToRemove.Select(x => new 
             { 
              ID = (string)x.Element("ID"), 
              Name = (string)x.Element("Name") 
             }).ToArray(); 
+0

在這種情況下,removedBooks會給我的IEnumerable 這是bulk.I只需要書的編號和名稱的鍵值對。 – Rockstart

+0

@Rockstart:請參閱更新。 –

+0

謝謝。但是booksToRemove.Remove();應該在最後,否則removeBooks將返回null。 – Rockstart