Linq - cannot implicitly convert the type 'System.Collections.Generic.IEnumerable <System.Xml.Linq.XElement>' to 'System.Collections.Generic.List <string>'
I get the following error:
It is not possible to implicitly convert the type 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.List'. Explicit conversion exists (are you skipping listing?)
My code is as follows:
public Profile PullActiveProfile() { //currentProfile.Decks = new List<string>(); return currentProfile = (from profiles in xmlDoc.Element("PlayerPofiles").Elements("Player")where (string)profiles.Element("Active") == "True" select new Profile { Name = (string)profiles.Element("Name"), Type = (string)profiles.Element("Type"), Verified = (string)profiles.Element("Verified"), Password = (string)profiles.Element("Password"), Email = (string)profiles.Element("Email"), Sex = (string)profiles.Element("Sex"), Avatar = (string)profiles.Element("Avatar").Attribute("path") ?? "", Created = (DateTime)profiles.Element("Created"), Birthday = (string)profiles.Element("Birthday") ?? "", Wins = (string)profiles.Element("Ratio").Element("Win") ?? "0", Losses = (string)profiles.Element("Ratio").Element("Loss") ?? "0", Abandoned = (string)profiles.Element("Ratio").Element("Abandoned"), // The following line is where I get the error. The decks node can have many descendants Decks = profiles.Elements("Decks").Descendants() .Select(x => x.ToString()).ToList(); }).FirstOrDefault(); } Here is the node structure:
<PlayerPofiles> <Player> <Name>Stacey - Online</Name> <Type>Full/Basic</Type> <Active>True</Active> <Verified>True</Verified> <Password>pass</Password> <Email> xxxx@gmail.com </Email> <Sex>Female</Sex> <Avatar path="/images/Treasure/BroadSword.png" /> <Ratio> <Win>0</Win> <Loss>0</Loss> <Abandoned>0</Abandoned> </Ratio> <Created>6/19/2011</Created> <Birthday>09/28/1989</Birthday> <Decks> <Base /> <Booty /> </Decks> </Player> +4
3 answers
I think you should get a <string> list, because just getting Descendents will give you [IEnumerable for XElement ]. ( http://msdn.microsoft.com/en-us/library/bb337483.aspx ) But you need an IEnumerable of type string . Replace "requiredname" with what you need to fill in the list:
profiles.Elements("Decks").Descendants() .Select(x => x.requiredname).ToList() +7
Remove the ";" after ToList ()
var profiles = xmlDoc.Element("PlayerPofiles").Elements("Player") .where(profile =>(profile.Element("Active") == "True")) .FirstOrDefault(); if(profiles!=null){ return new Profile { Name = (string)profiles.Element("Name"), Type = (string)profiles.Element("Type"), Verified = (string)profiles.Element("Verified"), Password = (string)profiles.Element("Password"), Email = (string)profiles.Element("Email"), Sex = (string)profiles.Element("Sex"), Avatar = (string)profiles.Element("Avatar").Attribute("path") ?? "", Created = (DateTime)profiles.Element("Created"), Birthday = (string)profiles.Element("Birthday") ?? "", Wins = (string)profiles.Element("Ratio").Element("Win") ?? "0", Losses = (string)profiles.Element("Ratio").Element("Loss") ?? "0", Abandoned = (string)profiles.Element("Ratio").Element("Abandoned"), // The following line removed the ; Decks = profiles.Elements("Decks").Descendants() .Select(x => x.Value.ToString()).ToList() }); } else { //Handle if null } +1
I would suggest that you first extract the entry from xml and then do the mapping as follows: -
var currentProfile = from profiles in xmlDoc.Element("PlayerPofiles").Elements("Player") where (string)profiles.Element("Active") == "True".FirstOrDefault() select profile Profile profile = new Profile(); profile.Name = currentProfile.Name; . // all your properties mapping . . return profile; 0