2012-03-12 54 views
0

XML構造:LINQ - 避けるため、重複したエントリ

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

私は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); 
     } 

にLINQに従うことによって、重複がxmlファイルに属性を挿入したくありません私はちょうど重複して新しい従業員を追加しようとしていますが、私のコードは重複を追加します。

私のクエリを見て、ロジックが不足している場所を教えてください。

+3

は、cを表示しますあなたが実際にどこに*追加*従業員 - 私はちょうどあなたが実際に従業員を追加しているコードを追加 – BrokenGlass

+0

ちょうどあなたが上書きするプロパティを参照してください – Macnique

+0

本当にあなたのforeachループを理解できません!ループ内に同じ属性のアイテムをあまりにも多く追加します! –

答えて

2

単に、そこにはループneccessaryはなく、またいかなるデフォルトのXMLを解析してXMLに新しい従業員を追加するには:

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

それが現在あなたがいることをすべての従業員を選択している、あなたのループが何のためにあるのか私には不明です別のユーザー名を持っていて、の場合、それぞれ新しい従業員ノードを追加した人のうち、があります。これはあまり意味がありません。新しい従業員を一度追加したいと思っています。

if(!userExistsAlready) 
{ 
    //add new user 
} 

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

は今、あなたは、新しい従業員を追加するコードの周りにチェックを入れることができます与えられたユーザー名を持つ従業員がすでに存在する場合は、一方でチェックしたい場合は

このLINQで

1

ユーザー名は、DISTINCT操作を提供し、ループを属性することができ照会:

var q = (from p in newEmployee.Descendants("Employee").Attributes("username") 
      select (string)p).Distinct(); 
関連する問題