LINQ .NET 4.0 - 单独使用OK - 单独订购OK - WHERE和ORDERBY失败

时间:2011-03-18 23:24:22

标签: linq-to-objects

下面正确运行且没有错误:

IEnumerable<FieldDef> FieldDefQuery =
    from fds in FieldDefs 
    where fds.DispLevel == enumDispLevel.Grid     
    select fds;

下面正确运行且没有错误:

IEnumerable<FieldDef> FieldDefQuery =
    from fds in FieldDefs    
    orderby fds.DispOrder ascending 
    select fds;

以下失败:

IEnumerable<FieldDef> FieldDefQuery =
    from fds in FieldDefs 
    where fds.DispLevel == enumDispLevel.Grid    
    orderby fds.DispOrder ascending 
    select fds;
foreach (FieldDef fd in FieldDefQuery)
{
    Debug.WriteLine(fd.DispName);
}

对于where和orderby子句,它在执行时失败并显示以下消息:

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred
Parameter name: Parameter index is out of range.
   at Gabe2a.GabeLib.FieldDef.get_DispLevel() in 
   at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() 

我只是无法弄清楚如何/为什么where子句单独是好的而且orderby-clause单独是好的但是这两个子句一起失败

1 个答案:

答案 0 :(得分:0)

我认为问题是LINQ查询在您枚举它们之前不会被评估。 DispLevel可以直接throw new Exception(),前两个块本身就不会造成任何问题。当你到达枚举查询的第三个块时,抛出异常。

深入了解DispLevel属性,您将找到问题的原因。