2016-12-07 33 views
2

我有與內容的XML文件:交叉聯接在LINQ的XML和LINQ對象名單

<?xml version="1.0" encoding="utf-8" ?> 
<packages> 
    <package productnumber="123"> 
    <stpos> 
     <pid>345</pid> 
     <vat>10</vat> 
    </stpos> 
    <stpos> 
     <pid>678</pid> 
     <vat>20</vat> 
    </stpos> 
    </package> 
    <package productnumber="246"> 
    <stpos> 
     <pid>81012</pid> 
     <vat>5</vat> 
    </stpos> 
    <stpos> 
     <pid>141618</pid> 
     <vat>2</vat> 
    </stpos> 
    </package> 
</packages> 

然後我仍然有一個產品列表:

var productList = new List<Product> 
{ 
    new Product {ProductNumber = "123" }, 
    new Product {ProductNumber = "345" }, 
    new Product {ProductNumber = "678" }, 
    new Product {ProductNumber = "246" }, 
    new Product {ProductNumber = "81012" }, 
    new Product {ProductNumber = "Nothing" }, 
}; 

我想,對於檢查每個包s productnumber and its pid存在於productList中。如果它真的,那麼返回這些包。

在我上面的示例:

我想回包productnumber 123因爲在產品列表中存在的所有3個產品編號。

包productnumber 246,因爲只有2產品號都包含在產品列表中不應該被退回,「沒什麼」不包含...

那是我的查詢:

var doc = XDocument.Load("./packages.xml"); 
    var query = (from package in doc.Descendants("packages").Elements() 
       from p in productList 
       where p.ProductNumber == package.Attribute("productnumber").Value && 
       productList.All(p => 
       package.Descendants("stpos").Select(x => x.Element("pid").Value).Contains(p.ProductNumber)) 
       select package).ToList(); 

我的query.Count()是0,我不明白爲什麼。

任何人都可以打開我的眼睛,請:-)

+0

但345和678,這是內部123的PID,不包含在'productList' – octavioccl

+0

這是我現在糾正的錯字!它仍然不起作用!伯爵仍然是零!我也認爲我的交叉加入 - 我目前如何使用它 - 是不正確的;-) – Elisabeth

回答

0

我覺得這是你想達到什麼目的:

var doc = XDocument.Load("./packages.xml"); 
var numbers=productList.Select(p=>p.ProductNumber); 
var query= doc.Descendants("package") 
       .Where(e=>numbers.Contains((string)e.Attribute("productnumber")) && 
         e.Descendants("stpos").All(p=>numbers.Contains((string)p.Element("pid")))); 
+0

嗯......你沒有使用元素上的.Value。隨着你的字符串鑄造代碼,我得到零計數。好的,我現在就開始工作了! =>它的後代(「包」),你必須做p.Element(「pid」)。價值,請添加到您的解決方案:-) – Elisabeth

+0

但「產品名稱」不是一個字符串屬性?獲取元素/屬性 – octavioccl

+0

pid的值,productNumber是一個字符串,都是! – Elisabeth