0

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

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

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

我发现有时,此语句可能会引发以下异常: System.InvalidOperationException: Nullable object must have a value。

我尝试进行单元测试,并用一个只有一个事务的 OriginalList 来提供它。此交易的 NValue 为空。它不会触发此异常。

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

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

2011-10-05 16:14:06,826 [SRV101 DC\Admin] [59] 错误 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
4

2 回答 2

1

您看到的错误似乎表明您正在尝试在 Null 上评估 .Value。尝试改用 .GetValueOrDefault ,否则更改 where 子句以检查 HasValue 评估者,而不仅仅是与 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。

于 2011-10-06T16:24:30.470 回答
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);
于 2011-10-06T13:44:11.950 回答