2014-09-25 55 views
0

我在查找代碼和檢查示例後,發現了嵌套類的查詢問題。在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(); 

站點A和網站B似乎是問題,這是一個子類調用SiteDetails類ConnectionItem 。編譯器顯示查詢沒有問題,但是在運行時,我通過投射到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 \項目\測試\測試\窗體\ frmMain.cs:線493

在System.Linq.Enumerable.WhereSelectEnumerableIterator`2 .MoveNext()

在System.Collections.Generic.List 1..ctor(IEnumerable 1集合)

在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)

在Piccolo_Test.frmMain。在c:\ Visual Studio 2013 \ Project中的readXML() s \ Test \ Test \ Forms \ frmMain.cs:line 492

這是lambda表達式的問題還是我不​​正確地轉換子類?

+3

['Select'(http://msdn.microsoft.com/en-us/library/bb548891(V = vs.110)的.aspx)返回集合,如果你想要一個對象使用['第一'](http://msdn.microsoft.com/en-us/library/vstudio/bb291976(v = vs.100).aspx)或['FirstOrDefault'](http://msdn.microsoft.com/ en-us/library/vstudio/bb549039(v = vs.100).aspx)或['Single'](http://msdn.microsoft.com/zh-cn/library/vstudio/bb535118(v = vs。 100).aspx)或['SingleOrDefault'](http://msdn.microsoft.com/en-us/library/vstudio/bb549274(v = vs.100).aspx)而不是 – Grundy 2014-09-25 16:02:06

+1

'Elements(「SiteA」) .Select(..)'返回'IEnumerable '。改變爲'Elements(「SiteA」)。Select(..)。FirstOrDefault()' – cgTag 2014-09-25 16:03:10

+1

你可能會遇到'SiteA'和'SiteB'完全空的問題,因爲你在獲取'q'屬性值。 'q'是'Connection'元素並且沒有屬性。 – 2014-09-25 16:07:23

回答

0

感謝上面評論中的人,我得到了它的工作。

As @Mathew和@Grundy提到,我需要.FirstOrDefault()在結束行,然後運行沒有錯誤,並輸出到列表主要部分除了SiteDetails值爲null。然後,正如@Ichabod指出的那樣,我錯誤地指的是外部表達式lambda值「r」而不是「s」。

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