2011-10-06 1 views
0

Вот заявление LINQ Я использую:InvalidOperationException Происходило в пункте OrderBy Linq

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

OriginalList список объектов сделки с более чем 10 тысяч элементов. NValue - свойство nullable транзакции. Каждый раз, когда OriginalList обновляется, оператор будет выполнен.

Я обнаружил, что время от времени это утверждение может вызывать следующее исключение: System.InvalidOperationException: объект Nullable должен иметь значение.

Я попытался выполнить модульное тестирование и подал его с помощью OriginalList только с одной транзакцией. Эта транзакция имеет null NValue. Это исключение не вызывает.

У кого-нибудь есть идея, что здесь происходит? Большое спасибо.

Мы используем Linq для SQL. Вот трассировки стека:

2011-10-05 16: 14: 06826 [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 
+1

Скажите, пожалуйста, какой тип LINQ вы используете - какой именно тип 'OriginalList', и используете ли вы LINQ to SQL, LINQ to NHibernate и т. Д.? –

+0

И будет полезно использовать stacktrace. – 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

ошибка вы видите, кажется, указывают, что вы пытаетесь вычисляться .Value на Null , Попробуйте использовать вместо .GetValueOrDefault, в противном случае изменить положение где для проверки HasValue оценщик, чем просто сравнение с нулем:

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 ​​Верно, но р .NValue.HasValue == false.

 Смежные вопросы

  • Нет связанных вопросов^_^