Wenn ich eine Reihe von Zeilen erhalten möchte, die eine einzelne Spalte von int
, verwende Dapper, und es ist möglich, dass diese Ergebnismenge leer ist. Wie verwende ich Dapper am besten, um diese Daten abzufragen?
Zum Beispiel, wenn ich die folgende Methode habe, die zurückgibt, was ich will:
public void int[] GetInts()
{
conn.Query<int?>("select 123 where 1=1")
.Where(x=> x.HasValue)
.Select(x => x.Value)
.ToArray();
}
Wenn ich die Zeile dahin ändere:
conn.Query<int>("select 123 where 1=0").ToArray();
Ich bekomme einen Casting-Fehler, wenn keine Ergebnisse vorliegen.
Der Stack-Trace befindet sich unterhalb und die Ausnahme ist nur ein Objektverweis, der beim (T)next
Casting (T)next
nicht auf die Instanz eines Objekts gesetzt wird:
at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in .\SqlMapper.cs:line 611
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in .\SqlMapper.cs:line 539
Mein Problem war, dass ich einen LEFT JOIN
im Code machte, aber während ich versuchte, den Fehler zu reproduzieren, benutzte ich einen INNER JOIN
, also konnte ich nicht das gleiche Verhalten reproduzieren. Mit dem LEFT JOIN
wurde eine einzelne Zeile mit dem Wert NULL
zurückgegeben, weshalb ich einen Castingfehler zwischen NULL
und int
.
Nun, das Where
und Select
machen keinen Sinn, wenn es ein Int ist. Ziemlich sicher, dass Sie sie entfernen möchten.
conn.Query<int>("select 123 where 1=0")
.ToArray();
Haben Sie irgendwelche Probleme, wenn Sie das tun?