2016-10-25 1 views
3

私はこの作品Dapper.netヌルDapper.netクエリ()

var x = connection.Query<int>("SELECT max(val) FROM info").FirstOrDefault(); 

を使用して、テーブルから最大IDを返したい - 何の行は、私が得る存在しない場合を除き

オブジェクト参照がオブジェクトのインスタンスに設定されていません。

「OrDefault」は、レコードが存在しないときに0を返さないはずですか?

クラッシュを防ぐために、0または一部のnull以外の値を返すにはどうすればよいですか。

+0

var x = connection.Queryでエラーが発生します。( "SELECT max(val)FROM info")。FirstOrDefault();またはxを使う前に? –

+0

SQLのアイデアのためにISNULL()をmax(val) –

+0

@viveknunaありがとうと使用してください。なぜこれもC#で動作しないのですか? – niico

答えて

7

問題

THXあなたはintの順序を期待するDapperのを言っているが、あなたが実際にnull値の可能性について持っているということです。だからどちらかのタイプ

var x = connection.Query<int?>("SELECT max(val) FROM info").Single() ?? 0; 

それともnullを処理するために、クエリを変更する必要がありますを変更する必要があります。

var x = connection.Query<int>("SELECT COALESCE(max(val), 0) FROM info").Single(); 

このクエリがしか正確に一つの行を返す必要がありますので、私はここにSingleを使用しています。

シーケンスが必要で、最初のアイテムのみが必要な場合、またはアイテムタイプのデフォルト値が必要なアイテムがない場合は、FirstOrDefaultを使用します。

+0

thx FirstOrDefaultはこのような状況で私たちを助けませんか?私は別の特定のヌルチェック(私は最初のルートを行くと仮定)を持っている必要があります。 – niico

+0

はい、 'OrDefault'部分は空の結果セット(行なし)にのみ適用されます。 – juharr

1
var x = connection.Query<int>("SELECT ISNULL(max(val), 0) FROM info").Single(); 

値がnullの場合にデフォルト値を選択する場合は、ISNULLを使用できます。