2013-07-29 18 views
5

Zrobiłem moje poszukiwania i nie byłem w stanie znaleźć rozwiązania problemu, który mam.Jak filtrować dynamicznie za pomocą C# xelement?

Jestem trochę nowy w C# .net.

Oto mój problem. Próbuję dynamicznie filtrować xelement.

Liczba atrybutów i wartość atrybutów nie są znane i będą zależeć od innej procedury/procesu.

Moja nazwa atrybutu do filtrowania, może być jednym lub więcej atrybutem do filtrowania.

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

mój plik xml jest w tej postaci:

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

można filtrować pomyślnie gdybym sztywno coś takiego

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

Jednakże, nie jest to, co chcę, bo nie będzie wiedział, który atrybut dokładnie chcę filtrować. Będzie generowany dynamicznie.

Na przykład w czasie wykonywania atrybut, który chcę filtrować, to tylko kod techcode i productgroup. Czy jakakolwiek dusza pomoże mi w dostarczeniu sugestii.

Odpowiedz

6

Można zbudować kwerendę dynamicznie:

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

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

UPDATE: Myślę, że problemem jest to, że zamiast jednej zmiennej someValue próbujesz uzyskać różne wartości dla każdego atrybutu. Ale tylko ostatnia jest przechwytywana w lambda. Musisz utworzyć zmienną lokalną do przechowywania wartości dla każdego lambda:

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

Przykro mi ... Po uruchomieniu sugerowanego rozwiązania, zapytanie pobiera ostatni parametr jako aktywny filtr. Przykład, jeśli używam param = {techcode, grupa produktów}, to tylko filtruj grupę produktów. Nadal zwraca wszystkie dane do techcode. –

+0

@AmirIsmail nie, to zapytanie dodaje wszystkie warunki filtrowania. Wygląda na to, że nie przypisujesz ponownie zapytania "query.Where" za każdym razem do oryginalnego zapytania: –

+0

. to właśnie zrobiłem: 'IEnumerable singlethread = apcxmlstate.Elements (" thread "); foreach (nazwa var w parametrze) { singlethread = singlethread.Where (t => (string) t.Attribute (name) == row [name] .ToString()); } if (! Singlethread.Any()) {// utworzyć nowy wątek} else {// wątek aktualizacji} ' ale nie tworzy go poprawnie –

Powiązane problemy