Хобрук: Ваш путь к мастерству в программировании

Как динамически фильтровать с помощью С# xelement?

Я сделал свой поиск и не смог найти решение проблемы, которая у меня есть.

Я немного новичок в С#.net.

Вот моя проблема. Я пытаюсь динамически фильтровать xelement.

Количество атрибутов и значение атрибутов неизвестны и будут зависеть от какой-либо другой процедуры/процесса.

это мое имя атрибута для фильтрации, может быть один или несколько атрибутов для фильтрации.

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

мой xml-файл имеет такую ​​форму:

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

Я могу успешно фильтровать, если я жестко запрограммировал что-то вроде этого

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

Однако это не то, что я хочу, потому что я не буду знать, какой именно атрибут я хочу отфильтровать. Он будет генерироваться динамически.

Например, во время выполнения атрибутом, который я хочу отфильтровать, является только технический код и группа продуктов. Любая добрая душа поможет мне сделать предложение.

29.07.2013

Ответы:


1

Вы можете построить запрос динамически:

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

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

ОБНОВЛЕНИЕ: я думаю, ваша проблема в том, что вместо одной переменной someValue вы пытаетесь получить разные значения для каждого атрибута. Но только последний захвачен в лямбде. Вам нужно создать локальную переменную для хранения значения для каждой лямбды:

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); 
}
29.07.2013
  • извините... после того, как я запустил предложенное вами решение, запрос принимает только последний параметр в качестве активного фильтра. Например, если я использую param = {techcode, productgroup}, он фильтрует только группу продуктов. Он по-прежнему возвращает все данные для техкода. 29.07.2013
  • @AmirIsmail нет, этот запрос добавляет все условия фильтрации. Похоже, вы не назначаете query.Where каждый раз исходному запросу 29.07.2013
  • Привет еще раз. это то, что я сделал IEnumerable<XElement> singlethread = apcxmlstate.Elements("thread"); foreach (var name in param) { singlethread = singlethread.Where(t => (string)t.Attribute(name) == row[name].ToString()); } if (!singlethread.Any()) { // create new thread } else { //update thread }, но он не создает его правильно 29.07.2013
  • @AmirIsmail взгляните на обновленный ответ и, пожалуйста, ответьте, сработало ли это в вашем случае. 29.07.2013
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..