2013-07-29 9 views
5

Ich habe meine Suche gemacht und war nicht in der Lage, eine Lösung für das Problem zu finden, das ich habe.Wie dynamisch mit C# xelement filtern?

Ich bin ein bisschen neu zu C# .net.

Hier ist mein Problem. Ich versuche, xelement dynamisch zu filtern.

Die Anzahl der Attribute und der Wert der Attribute sind nicht bekannt und hängen von anderen Routinen/Prozessen ab.

diese meinen Attributnamen zu filtern, kann ein oder mehrere zu filternde Attribute sein.

string[] param = new string[] { "techcode", "productgroup", "photolayer" } 

meine XML-Datei in dieser Form:

<?xml version="1.0" encoding="utf-8"?> 
<threads> 
    <thread techcode="sometech" productgroup="pgroup" 
      photolayer="player" biasewma="-0.05" /> 
</threads> 

Ich kann erfolgreich auswählen, wenn ich so etwas wie diese jedoch

IEnumerable<XElement> singlethread = (from el in apcxmlstate.Elements("thread") 
    where 
    (string)el.Attribute("techcode") == somevalue 
    && (string)el.Attribute("productgroup") == somevalue 
    && (string)el.Attribute("photolayer") == somevalue 
    select el); 

fest einprogrammiert, dann ist dies nicht das, was ich will, weil ich Ich weiß nicht, welches Attribut ich genau filtern möchte. Es wird dynamisch generiert.

Zum Beispiel, Attribut zur Laufzeit, die ich Filter möchten, sind nur Techcode und Produktgruppe. Würde irgendeine freundliche Seele mir helfen, einen Vorschlag zu machen?

Antwort

6

können Sie Abfrage erstellen dynamisch:

IEnumerable<XElement> query = apcxmlstate.Elements("thread"); 

foreach(var name in param) 
    query = query.Where(t => (string)t.Attribute(name) == someValue); 

UPDATE: Ich denke, Ihr Problem ist, dass anstelle von einzelnen someValue Variable Sie versuchen, für jedes Attribut unterschiedliche Werte zu erhalten. Aber nur der letzte wird in Lambda eingefangen. Sie müssen eine lokale Variable erstellen, um den Wert für jedes Lambda zu speichern:

IEnumerable<XElement> singlethread = apcxmlstate.Elements("thread"); 

foreach (var name in param) { 
    var value = row[name].ToString(); 
    singlethread = singlethread.Where(t => (string)t.Attribute(name) == value); 
} 
+0

im sorry ... nachdem ich Ihre vorgeschlagene Lösung ausgeführt habe, nehme die Abfrage nur den letzten Parameter als aktiven Filter. Beispiel wenn ich param = {techcode, productgroup} verwende, filtert es nur die Produktgruppe. Es gibt immer noch alle Daten für Techcode zurück. –

+0

@AmirIsmail Nein, diese Abfrage fügt alle Filterbedingungen hinzu. Sieht so aus, als würden Sie nicht jedes Mal query.Where der ursprünglichen Abfrage –

+0

hi wieder zuweisen. das habe ich gemacht 'IEnumerable singlethread = apcxmlstate.Elements (" thread "); foreach (var Name in Parameter) { singlethread = singlethread.Where (t => (Zeichenfolge) t.Attribute (Name) == Zeile [Name] .ToString()); } if (! Singlethread.Any()) {// erstellen neuen Thread} sonst {// Update Thread} ' aber es macht es nicht –