1

dbの最後のcustomer_idをチェックするこのコードがあります。

ObjectResult<int?> last_customer_id_collection = MainForm.eggsContext.ExecuteStoreQuery<int?>("select MAX(customer_id) from customers");

次に、このように必要な次のIDを取得します

new_customer_id = last_customer_id_collection.FirstOrDefault<int?>().Value + 1;

それは機能していますが、新しい空のデータベースを処理するとき、ステートメントlast_customer_id_collection.FirstOrDefault<int?>()はInvalidOperationExceptionをスローします。

キャッチを試行せずにlast_customer_id_collectionが空であったかどうかを確認するにはどうすればよいですか?

last_customer_id_collection.Any<int?>()(ps私はまたはまたはDefaultIfEmptyなどをチェックしようとしましlast_customer_id_collection.Count<int?>()たが、私が試みるすべてがこの例外を引き起こします)

4

1 に答える 1

1

Nullable<T>.HasValuefalseを返すため、InvalidOperationExceptionが発生します。

.Valueクエリの戻り値がnullの場合に呼び出さないように、コードを変更する必要があります。

var custId = last_customer_id_collection.FirstOrDefault<int?>();
if(custId.HasValue)
    DoStuffWithId();
else
    DoStuffWithNullResult();

Nullablesの潜在的な混乱する動作を示す小さな例これは次のように出力されます。

「Null!」、「値はありませんがNullReferenceExceptionはありません」、「Oops、InvalidOperationException」

List<int?> values = new List<int?>();

var test = values.FirstOrDefault();

if (test == null)
    Console.WriteLine("Null!");

if (test.HasValue)
    Console.WriteLine(test.Value);
else
    Console.WriteLine("No Value but no NullReferenceException");

try
{
    int value = test.Value;
}
catch(InvalidOperationException)
{
    Console.WriteLine("Oops, InvalidOperationException");
}
于 2012-06-24T13:29:21.407 に答える