这是我正在使用的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
答案 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);