2016-10-25 3 views
3

würde Ich mag die max Id aus einer Tabelle zurück Dapper.net mitNull Dapper.net Abfrage noch null-Verweisausnahme mit FirstOrDefault Rückkehr()

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

Dies funktioniert - es sei denn, keine Zeile vorhanden ist, dann bekomme ich eine

Objektverweis nicht auf eine Instanz eines Objekts gesetzt.

Sollte 'OrDefault' nicht bedeuten, dass 0 zurückgegeben wird, wenn keine Datensätze vorhanden sind?

Wie kann ich 0 - oder einige nicht null Wert zurückgeben, um einen Absturz zu verhindern.

thx

+0

erhalten Sie Fehler in var x = connection.Query ("SELECT max (val) FROM info"). FirstOrDefault(); oder bevor du x benutzt? –

+0

Verwenden Sie ISNULL() mit max (val) –

+0

@viveknuna danke für SQL-Idee - Ich würde gerne verstehen, warum dies in C# nicht funktioniert auch. – niico

Antwort

7

Das Problem ist, dass Sie Dapper doch sagen, eine Folge von int zu erwarten, aber Sie haben tatsächlich die Möglichkeit eines null Wert. So müssen Sie entweder den Typ

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

Oder Sie müssen sich ändern, die Abfrage ändern, um die null zu behandeln. immer nur genau eine Zeile zurückgeben

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

Ich verwende Single hier, weil diese Abfrage sollte.

Sie würden FirstOrDefault verwenden, wenn Sie eine Sequenz erwarten und nur das erste Element möchten oder wenn keine Elemente den Standardwert des Elementtyps haben sollen.

+0

thx FirstOrDefault hilft uns in dieser Situation nicht? Ich muss einen anderen spezifischen Null-Check haben (vorausgesetzt, ich gehe die erste Route). – niico

+0

Ja, der 'OrDefault' Teil gilt nur für eine leere Ergebnismenge (keine Zeilen). – juharr

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

Sie können ISNULL verwenden, wenn Sie den Standardwert auswählen möchten, wenn der Wert null ist.