Checking if a column belongs to a provided list
Can you see a better solution?  


Yes use braces {} also for single line statements of an if condition.  

Using .Any() instead of checking .Length &gt; 0 is faster but only for an IEnumerable

I also would enclose reader["IDAgentClient"] == DBNull.Value in () as it is more readable or even better you can introduce a boolean isDbNullValue

DataRow[] drsIDAgentClient = reader.GetSchemaTable().Select("ColumnName = 'IDAgentClient'");
if (drsIDAgentClient.Length &gt; 0)
{
    Boolean isDbNullValue = (reader["IDAgentClient"] == DBNull.Value);
    coupon.IdAgentClient = isDbNullValue  ? null : (int?)reader["IDAgentClient"];
}  




After rereading your question it seems that you want to know if a column with a specific name exists in the SchemaTable.    

So you can use instead of the code above simply this

String columnName = "IDAgentClient";
if (reader.GetSchemaTable().Columns.Contains(columnName))
{
    Boolean isDbNullValue = (reader[columnName] == DBNull.Value);
    coupon.IdAgentClient = isDbNullValue  ? null : (int?)reader[columnName];
}  


I would like to expand @Malachi's answer with not using a tenary

Malachi's check


bool IsColumnEmpty(string columnName)
{
    return reader.GetSchemaTable().Columns.Contains(columnName)) 
        ? Reader[columnName] == DBNull.Value 
        : true;
}  



can be rewritten like  

bool ColumnHasValue(string columnName)
{
    return reader.GetSchemaTable().Columns.Contains(columnName) &amp;&amp; 
           Reader[columnName] != DBNull.Value;        
}  


and if you really need to use an extension method you can do this like  

public static class HelperExtension
{
    public static bool ColumnHasValue(this IDataReader reader, string columnName)
    {
        return reader.GetSchemaTable().Columns.Contains(columnName) &amp;&amp; 
               Reader[columnName] != DBNull.Value; 
    }
}  


and call it  

coupon.IdAgentClient = reader.ColumnHasValue(columnName) ? (int?)reader[columnName] : null;