Linq orderby子句中发生InvalidOperationException

时间:2011-10-06 12:47:54

标签: c# .net linq linq-to-sql invalidoperationexception

这是我正在使用的linq语句:

var sortedList =
        (from p in OriginalList
         where p.NValue != null
         orderby Math.Abs(p.NValue.Value) descending
         select p);

OriginalList是一个包含超过1万个元素的Transaction对象列表。 NValue是Transaction的可空属性。每次更新OriginalList时,都会执行该语句。

我发现有时这句话会抛出以下异常: System.InvalidOperationException:Nullable对象必须具有值。

我尝试进行单元测试,并使用只有一个Transaction的OriginalList。此事务具有null NValue。它不会触发此异常。

任何人都知道这里发生了什么?非常感谢。

我们正在使用Linq to SQL。这是堆栈跟踪:

2011-10-05 16:14:06,826 [SRV101 DC \ Admin] [59] ERROR Utils.AProxy`1 - 负载期间AProxy [TProxy]错误

System.InvalidOperationException: Nullable object must have a value.

at CServer.TLoader.b__2(Trasaction p) in c:\...\TLoader.cs:line 61
at System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count)
at System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count)
at System.Linq.OrderedEnumerable`1.d__0.MoveNext()
at CServer.TLoader.GetMultipliers(IEnumerable`1 OriginalList) in c:\...\TLoader.cs:line 64
at CServer.TProxy.OnLoad() in c:\...\TProxy.cs:line 29
at Utils.AProxy`1.Load() in c:\...\AProxy.cs:line 252

2 个答案:

答案 0 :(得分:1)

您看到的错误似乎表明您正试图在Null上评估.Value。请尝试使用.GetValueOrDefault,否则更改您的where子句以检查HasValue rater,而不仅仅是与null进行比较:

var sortedList h= 
        (from p in OriginalList 
         where p.NValue.HasValue 
         orderby Math.Abs(p.NValue.Value) descending 
         select p); 

在你的情况下,p.NValue = Nullable因此p.NValue == null evalues为True,但是p.NValue.HasValue == false。

答案 1 :(得分:0)

我不认为Linq-to-Sql支持Math.Abs​​,所以你可以这样做

var sortedList =
        (from p in OriginalList
         where p.NValue != null
         orderby p.NValue.Value < 0 ? (p.NValue.Value * -1) : p.NValue.Value descending
         select p);