我在查找代碼和檢查示例後,發現了嵌套類的查詢問題。在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表達式的問題還是我不正確地轉換子類?
['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
'Elements(「SiteA」) .Select(..)'返回'IEnumerable'。改變爲'Elements(「SiteA」)。Select(..)。FirstOrDefault()' –
cgTag
2014-09-25 16:03:10
你可能會遇到'SiteA'和'SiteB'完全空的問題,因爲你在獲取'q'屬性值。 'q'是'Connection'元素並且沒有屬性。 – 2014-09-25 16:07:23