Dapperを使用して、 int
単一の列を含む行の束を取得したい場合、この結果セットが空である可能性があります。 Dapperを使用してこのデータを照会する最良の方法は何ですか?
たとえば、私が望むものを返す次のメソッドがあるとします。
public void int[] GetInts()
{
conn.Query<int?>("select 123 where 1=1")
.Where(x=> x.HasValue)
.Select(x => x.Value)
.ToArray();
}
この行を次のように変更した場合:
conn.Query<int>("select 123 where 1=0").ToArray();
結果がない場合、キャストエラーが発生します。
スタックトレースは以下の通りですが、例外として、 (T)next
キャスト(T)next
時にオブジェクトのインスタンスに設定されていないオブジェクト参照のみです。
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
私の問題は、コードでLEFT JOIN
を行っていたことが判明しましたが、エラーを再現しようとしたときにINNER JOIN
を使用していたため、同じ動作を再現できませんでした。 LEFT JOIN
では、 NULL
の値を持つ単一の行が返されたため、 NULL
とint
間のキャストエラーが発生しました。
まあ、 Where
とSelect
はintであれば意味をなさない。あなたはそれらを削除したいと確信しています。
conn.Query<int>("select 123 where 1=0")
.ToArray();
あなたはそれをするときに何か問題がありますか?