private void SetupDataReaderDeserializer(Type type, DbDataReader reader) { if (ReferenceEquals(type, returnType)) { return; } var columnNames = DbQueryInternal.IsClrType(type) ? NoColumnNames : DbQueryInternal.GetColumnNames(reader); var columnTypes = DbQueryInternal.GetColumnTypes(reader); dataReaderDeserializer = DataReaderDeserializerCache.GetCachedOrBuildNew(connectionType, type, columnNames, columnTypes); returnType = type; }
private void SetupDataReaderDeserializer(DbDataReader reader) { if (returnType != null) { return; } var columnNames = DbQueryInternal.GetColumnNames(reader); var columnTypes = DbQueryInternal.GetColumnTypes(reader); returnType = DynamicTypeCache.GetCachedOrBuildNew(columnNames, columnTypes); dataReaderDeserializer = DataReaderDeserializerCache.GetCachedOrBuildNew(connectionType, returnType, columnNames, columnTypes); }
/// <summary> /// Execute query and return the only element in the result, or a default element if the result is empty; this method throws an exception if there is not exactly one element in the result. /// </summary> /// <param name="connection">Database connection.</param> /// <param name="parameters">Query parameters.</param> /// <param name="transaction">Transaction to use.</param> /// <returns>Single element in the result or the default value.</returns> public dynamic QuerySingleOrDefault(IDbConnection connection, object parameters = null, IDbTransaction transaction = null) { if (connection == null) { ThrowException.ValueCannotBeNull(nameof(connection)); } using (var command = SetupCommand(connection, parameters, transaction)) using (var reader = (DbDataReader)command.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.SequentialAccess)) { SetupDataReaderDeserializer(reader); return(DbQueryInternal.QuerySingleOrDefault <dynamic>(reader, dataReaderDeserializer)); } }