Converting recordsets to POCO
public static IEnumerable&lt;T&gt; AsList&lt;T&gt;(this Recordset rs) where T : new()
{
    ..
    List&lt;T&gt; results = new List&lt;T&gt;();
    ..   
    return results.AsEnumerable();
}



This might be very inefficient because when I see that a method returns an IEnumerable&lt;T&gt; I assume its execution is deferred so I automatically do AsList(..).ToList() to execute it but what it actually does, is to iterate the list twice. First time to create the first list and then to create the second list. You should either create a real deferred method or return the List&lt;T&gt; so there is no doubt about the result.




IEnumerable&lt;PropertyInfo&gt; props = new List&lt;PropertyInfo&gt;(typeof(T).GetProperties()).Where(p =&gt; p.CanWrite);



You are executing this Where query for each record because the list wrapps only the GetProperties part (which is an array anyway so I don't understand why you convert it into a list in the first place - linq can work with arrays). You need to call the ToList extension after the Where

var properties = typeof(T).GetProperties().Where(p =&gt; p.CanWrite).ToList();




I also suggest moving the object creation into a separate method so that you don't have any nested loops like this:

public static IEnumerable&lt;T&gt; AsList&lt;T&gt;(this Recordset rs) where T : new()
{
    var properties = typeof(T).GetProperties().Where(p =&gt; p.CanWrite).ToList();
    while (!rs.Eof)
    {
        yield return CreateInstance&lt;T&gt;(properties, rs);        
        rs.MoveNext();
    }
}

private static T CreateInstance&lt;T&gt;(IEnumerable&lt;PropertyInfo&gt; properties, Row row) where T : new()
{
    var obj = new T();
    foreach (var property in properties)
    {
        var value = row[property.Name].Value;
        if (value != null) property.SetValue(obj, Convert.ChangeType(value, property.PropertyType));
    }
    return obj;
}