在Linq查询中强制嵌套类的异常

时间:2014-09-25 15:59:31

标签: c# linq

我在解决嵌套类的问题时遇到问题,在使用代码并检查示例之后我最终得到了以下内容。

基本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表达式的问题还是我错误地转换了子类?

1 个答案:

答案 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()