2011-12-20 55 views
1

我在使用foreach构造中的var变量尝试循环查询对象时出现错误。我正在将xml加载到数据集中,并为显式原因对Linq执行数据集。请纠正我的错误。这是我的代码:使用var匿名对象获取LINQ的InvalidCastException

ds.ReadXml(fsReadXml); 

DataTable myDataTable = ds.Tables[0]; 

var ordersQuery = myDataTable.AsEnumerable(); 

var subQuery = (from Geo03 in ordersQuery 
       select new 
       { 
        PARENTTYPE = Geo03.Field<String>("PARENTTYPE"), 
        PARENTINSTANCE = Geo03.Field<int>("PARENTINSTANCE"), 
        CHILDTYPE = Geo03.Field<String>("CHILDTYPE"), 
        CHILDINSTANCE = Geo03.Field<String>("CHILDINSTANCE"), 
        CHILDPOS = Convert.ToInt32(Geo03.Field<int>("CHILDPOS")) 
}); 
XDocument doc = null; 
foreach (var cin in subQuery) 
{ 


} 

这是产生错误:

System.InvalidCastException: Specified cast is not valid. 
    at System.Data.DataRowExtensions.UnboxT`1.ValueField(Object value) 
    at System.Data.DataRowExtensions.Field[T](DataRow row, String columnName) 
    at SpectraWorkon.Program.<Main>b__0(DataRow Geo03) in c:\users\arun\documents\visual studio 2010\Projects\SpectraWorkon\SpectraWorkon\Program.cs:line 29 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at SpectraWorkon.Program.Main(String[] args) in c:\users\arun\documents\visual studio 2010\Projects\SpectraWorkon\SpectraWorkon\Program.cs:line 38 

我收到错误行foreach (var cin in subQuery),称这是无法施展。

回答

5

你在打电话给Field<int>的字段不是int

+0

+1快速和直接:) – TheBoyan 2011-12-21 00:05:57

+0

@all,所以如何可以遍历我的查询?..我迷路了.. :( – user1061293 2011-12-21 06:48:15

2

请记住,直到您实际使用它(例如在foreach循环中,或者您调用.ToList())之前,linq查询才会被执行。所以在你的情况下,异常是在你建立查询的部分。 InvaliCastException表明您填写的字段不是您期望的类型。所以我建议你在查询中检查Field<T>的类型。

+0

+1更深入的解释。(stacktrace明确表示它是从'字段'但没有说明如何) – SLaks 2011-12-21 00:32:26