2016-12-07 2 views
2

ich mit dem Inhalt einer XML-Datei haben:Kreuz verbinden über Linq XML und Linq Objekte Listen

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

dann Liste Ich habe immer noch ein Produkt:

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" }, 
}; 

Ich möchte, dass für die Prüfung jedes Paket s productnumber and its pid s existiert in der Produktliste. Wenn es wahr ist, dann gebe das Paket zurück.

In meinem Beispiel oben:

Ich möchte Rückholpaket mit Produktnummer 123, da alle drei Produktnummern in der Produktliste vorhanden sind.

Das Paket mit Produktnummer 246 nicht weil nur 2 Produktnummern enthalten sind, in der Produktliste zurückgegeben werden soll, „Nichts“ nicht enthalten ist ...

Das ist meine Frage:

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

Mein query.Count() ist 0 und ich verstehe nicht warum.

Kann jemand meine Augen öffnen bitte :-)

+0

Aber 345 und 678, die die PIDs innerhalb 123 sind, nicht enthalten sind in 'productList' – octavioccl

+0

Das war ein Tippfehler, den ich jetzt korrigiert habe! Es funktioniert immer noch nicht! Graf ist immer noch NULL! Ich denke auch, dass mein Cross beitreten - wie ich es im Moment benutze - ist nicht korrekt ;-) – Elisabeth

Antwort

0

Ich denke, das ist, was Sie zu erreichen versuchen:

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

Hm ... du verwendest nicht den .Value auf dem Element. Mit deinem String Casted Code bekomme ich ZERO Count. Ok ich habe es jetzt funktioniert! => Seine Nachfolger ("package") und du musst p.Element ("pid") tun. Value, Bitte füge das zu deiner Lösung hinzu :-) – Elisabeth

+0

Aber "ProductName" ist keine String-Eigenschaft ?, Casting wird auch Holen Sie sich den Wert des Elements/Attributs – octavioccl

+0

pid, Produktnummer ist ein String, beides! – Elisabeth