LINQ to XML - избегайте дублирования записей - PullRequest
0 голосов
/ 13 марта 2012

Структура XML:

<Emp>
<Employee username="John"/>      
<Employee username="Jason"/>
</Emp>

Я не хочу вставлять дублирующиеся атрибуты в файл xml, выполнив запрос linq to xml

   var newEmployee= XElement.Parse(defaultEmployee.ToString());
   var q = from p in doc.Descendants("Employee")
                        let attr = p.Attribute("username")
                        where attr != null && attr.Value != txtusername.Text 
                        select p;



     foreach(var dupes in q)
      {
         newEmployee.Attribute("username").Value = txtusername.Text ;
         doc.root.Add(newEmployee);
         doc.save(EmployeeFile);
      }

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

Может кто-нибудь взглянуть на мой запрос и сообщить, где мне не хватает логики?

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

Чтобы добавить нового сотрудника в ваш xml, нет необходимости в цикле и парсинга XML по умолчанию, просто:

doc.Root.Add(new XElement("Employee", 
                          new XAttribute("username", txtusername.Text));

Мне неясно, для чего нужен ваш цикл, в настоящее время вы выбираете любого сотрудникас другим именем пользователя, и для каждого из тех, что вы добавляете новый узел сотрудника - это не имеет особого смысла, я подозреваю, что вы хотите добавить нового сотрудника только один раз.

С другой стороны, если вы хотите проверить, существует ли уже сотрудник с данным именем пользователя:

bool userExistsAlready = doc.Descendants("Employee")
                            .Any(x=> (string)x.Attribute("username") ==  txtusername.Text);

Теперь вы можете проверить код, добавляющий нового сотрудника:

if(!userExistsAlready)
{
  //add new user
}
1 голос
/ 13 марта 2012

С помощью этого запроса LINQ вы можете зациклить атрибуты имени пользователя, предоставив операцию DISTINCT:

    var q = (from p in newEmployee.Descendants("Employee").Attributes("username")
            select (string)p).Distinct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...