2011-10-06 36 views
0

發生在這裏是我使用的LINQ聲明:InvalidOperationException異常Linq中的排序依據條款

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

OriginalList是交易的列表,包括超過10000種元素的對象。 NValue是Transaction的可空屬性。每次更新OriginalList,該語句都會被執行。

我發現有時會發生這樣的情況: System.InvalidOperationException:可爲空的對象必須有一個值。

我試着做單元測試,並用一個OriginalList給它提供一個事務。該交易具有空的NValue。它不會觸發這個例外。

任何人都知道這裏發生了什麼?非常感謝。

我們正在使用Linq to SQL。這裏是堆棧跟蹤:

2011-10-05 16:14:06826 [SRV101 DC \管理員] [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 
+1

請告訴我們你正在使用什麼類型的LINQ - 什麼是'OriginalList'的確切類型,你使用LINQ to SQL,LINQ to NHibernate等? –

+0

而且一個堆棧跟蹤會很有幫助。 – Steven

+0

digEmAll的答案發生了什麼?我確實看到它是正確的。 –

回答

0

我不認爲Math.Abs​​中的LINQ到SQL支持,所以你可以做這樣的事情

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); 
1

您所看到的錯誤似乎表明,你正在試圖evalute .value的一個空。嘗試使用.GetValueOrDefault代替,否則改變你的where子句來檢查的HasValue評估者不僅僅是對空比較:

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

在你的情況p.NValue =可空從而p.NValue == NULL evalues爲True太大,而p .NValue.HasValue == false。