2013-07-17 2 views
1

Я получаю следующее сообщение об ошибке:C# LINQ ошибки XML: не может неявно преобразовать тип

Не может неявно преобразовать тип System.Collections.Generic.IEnumerable в System.Xml.Linq.XElement. Явное преобразование существует (вы пропали без вести броска?)

У меня есть файл XML, который выглядит примерно так:

<Users xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/"> 
<User ID="91" Name="Jane Smith" LoginName="domain1\jsmith" /> 
<User ID="814" Name="Brad Jones" LoginName="domain1\bjones" /> 
<User ID="1252" Name="Charles Johnson" LoginName="domain2\cjohnson" /> 
</Users> 

Я хочу, чтобы выбрать узел с определенным идентификатором. Вот мой код (где положение дает ошибку):

XmlNode siteUsers = tempug.GetUserCollectionFromSite(); 
string innerXML = siteUsers.InnerXml; 
XDocument siteUserData = XDocument.Parse(innerXML); 
XElement userNode = siteUserData.Descendants("User") 
    .Where(n => n.Attribute("ID").Value.Equals("12"); 

ответ

2

использование

XElement userNode = siteUserData.Descendants("User") 
    .Where(n => n.Attribute("ID").Value.Equals("12").FirstOrDefault(); 

или

XElement userNode = siteUserData.Descendants("User") 
    .Where(n => n.Attribute("ID").Value.Equals("12").SingleOrDefault(); 

вы можете использовать Single() и First() Aswell, в зависимости от того, насколько строги вы хотите возвращение быть.

2

Вы должны изменить .Where в последней строке .SingleOrDefault

2

.Where() возвратит IEnumerable даже если есть только один пункт в нем. Если вы ожидаете вернуть только один элемент, вы можете позвонить .First() или .FirstOrDefault() на Перечислимый.

2

Вы должны сказать LINQ вы хотите только 1 узел

var userNode = siteUserData.Descendants("User") 
    .FirstOrDefault(n => n.Attribute("ID").Value.Equals("12")); 
Смежные вопросы