我在解决嵌套类的问题时遇到问题,在使用代码并检查示例之后我最终得到了以下内容。
基本XML是
<Connections>
<Connection>
<ConnectionName>CConnect</ConnectionName>
<SiteA SiteName="Site1" IP="000">Site1info</SiteA>
<SiteB SiteName="Site2" IP="000">Site2info</SiteB>
</Connection>
</Connections>
LINQ查询输出到列表
List<ConnectionItem> NewConnectionList = xDoc.Root.Elements("Connection")
.Select(q => new ConnectionItem
{
ID = (string)q.Element("ID"),
ConnectionName = (string)q.Element("ConnectionName"),
TypeList = (string)q.Element("TypeList"),
SiteA = (SiteDetails)q.Elements("SiteA").Select(s => new SiteDetails { SiteName = (string)q.Attribute("SiteName"), Router = (string)q.Attribute("Router"), IP = (string)q.Attribute("IP") }),
SiteB = (SiteDetails)q.Elements("SiteB").Select(s => new SiteDetails { SiteName = (string)q.Attribute("SiteName"), Router = (string)q.Attribute("Router"), IP = (string)q.Attribute("IP") })
}).ToList();
SiteA和SiteB似乎是问题,它是类 ConnectionItem 中的子类调用 SiteDetails 。编译器显示查询没有问题,但是在运行时我通过转换到SiteDetails来捕获错误。
System.InvalidCastException:无法将类型为'WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,Piccolo_Test.SiteDetails]'的对象强制转换为'Piccolo_Test.SiteDetails'。
在Piccolo_Test.frmMain.b__c(XElement q)的c:\ Visual Studio 2013 \ Projects \ Test \ Test \ Forms \ frmMain.cs:第493行
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
在System.Collections.Generic.List
1..ctor(IEnumerable
1集合)在System.Linq.Enumerable.ToList [TSource](IEnumerable`1 source)
在Piccolo_Test.frmMain.readXML()中的c:\ Visual Studio 2013 \ Projects \ Test \ Test \ Forms \ frmMain.cs:第492行
这是lambda表达式的问题还是我错误地转换了子类?
答案 0 :(得分:0)
感谢上面评论中的人们,我得到了它的工作。
正如@Mathew和@Grundy所提到的,我需要在终点行使用.FirstOrDefault(),然后在没有错误的情况下运行并输出到主要部分列表,除了SiteDetails值为null。然后正如@Ichabod指出的那样,我错误地引用了外部表达式lambda值&#34; r&#34;而不是&#34; s&#34;。
SiteA = (SiteDetails)q.Elements("SiteA").Select(s => new SiteDetails { SiteName = (string)s.Attribute("SiteName"), Router = (string)s.Attribute("Router"), IP = (string)s.Attribute("IP") }).FirstOrDefault()