LinqからXmlへ:属性値がIEnumerable <XElement>のノード値と等しい場合に要素を選択する


8

私はxmlファイルから私が欲しいのノードが含まれているのIEnumerableオブジェクトを作成:

<rosterlist> 
    <roster> 
     <userid>1</userid> 
     <name></name> 
     <etc></etc> 
    </roster> 
    <roster> 
     <userid>2</userid> 
     <name></name> 
     <etc></etc> 
    </roster> 
</rosterlist> 

私はuserid属性のみユーザーをつかむしたい:それはこれらのコレクションですので、

IEnumerable<XElement> rosters = XDocument.Load("roster.xml") 
             .Elements("rosterlist") 
             .Elements("roster") 
             .Where(w => w.Element("division") 
                 .Value 
                 .Equals("SUPER AWESOME DIVISION")); 

rostersコレクション内のuseridノードでもあります。

IEnumerable<XElement> users = XDocument.Load("user.xml") 
             .Elements("userlist") 
             .Elements("user") 
             .Where(w => rosters.Elements("userid") 
                  .Contains(w.Attribute("userid").Value)); 

しかし、それは私にエラーを与えています:

メソッド 'System.Linq.Enumerable.Contains(System.Collections.Generic.IEnumerable、TSource)'の型引数を推論することはできません使用法。明示的に型引数を指定してみてください。

は私のアプローチの何が問題になっているのですか?

6

最後のコードスニペットでは、...Elements("userid")は、Valueプロパティによって返されたStringを含むことのできないXElementオブジェクトのリストを返します。私が参加したクエリを使用することにより、これを行うと思いますしかしこれは...

IEnumerable<XElement> rosters = obRoot.Elements("rosterlist").Elements("roster"); 
var rosterUserIds = (rosters.Elements("userid").Select(r => r.Value)); 
IEnumerable<XElement> users = obRoot.Elements("userlist").Elements("user") 
       .Where(u => rosterUserIds.Contains(u.Attribute("userid").Value)); 

を動作するはずです。..を選択し、ユーザーはそれがこの

string sXml = @" 
<root> 
<rosterlist> 
    <roster> 
     <userid>1</userid> 
     <name>R1</name> 
     <etc></etc> 
    </roster> 
    <roster> 
     <userid>2</userid> 
     <name>R2</name> 
     <etc></etc> 
    </roster> 
</rosterlist> 
<userlist> 
    <user userid='1'> 
     <name>User on roster</name> 
    </user> 
    <user userid='5'> 
     <name>User not on roster</name> 
    </user> 
</userlist> 
</root> 

"; 

XElement obRoot = XElement.Parse(sXml); 
var results = from user in obRoot.Elements("userlist").Elements("user") 
    join roster in obRoot.Elements("rosterlist").Elements("roster") 
    on user.Attribute("userid").Value equals roster.Element("userid").Value 
    select new {Name=user.Element("name").Value, RosterName=roster.Element("name").Value} ; 

foreach (var v in results) 
{ 
    Console.WriteLine("{0, -20} on Roster {1, -20}", v.Name, v.RosterName); 
} 

のようなものを出力して行くと思いますユーザーID
の名簿に参加します:

User on roster  on Roster R1