InvalidOperationException Произошло в предложении Linq orderby - PullRequest
0 голосов
/ 06 октября 2011

Вот оператор linq, который я использую:

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

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

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

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

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

Мы используем 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

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Ошибка, которую вы видите, указывает на то, что вы пытаетесь оценить.Попробуйте вместо этого использовать .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 переходит в True,но p.NValue.HasValue == false.

0 голосов
/ 06 октября 2011

Я не думаю, что Math.Abs ​​поддерживается в Linq-to-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);
...