0

私が使用している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 の null 許容プロパティです。OriginalList が更新されるたびに、ステートメントが実行されます。

System.InvalidOperationException: Nullable オブジェクトには値が必要です。

単体テストを実行しようとして、トランザクションが 1 つだけの OriginalList を入力しました。このトランザクションの NValue は null です。この例外は発生しません。

ここで何が起こっているのか誰にも分かりますか?どうもありがとう。

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
4

2 に答える 2

1

表示されているエラーは、Null で .Value を評価しようとしていることを示しているようです。代わりに .GetValueOrDefault を使用してみてください。それ以外の場合は、where 句を変更して、null と比較するだけでなく、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 evalue は True ですが、 p.NValue.HasValue == false です。

于 2011-10-06T16:24:30.470 に答える
0

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);
于 2011-10-06T13:44:11.950 に答える