Я бы рекомендовал использовать OdbcDataReader вместе с функцией Transform. Должно работать что-то вроде следующего:
public class OdbcQuery
{
OdbcCommand Command { get; set; }
public OdbcQuery(OdbcConnection connection, string cmdText)
{
Command = new OdbcCommand(cmdText, connection);
}
public List<T> Transform<T>(Func<OdbcDataReader, T> transformFunction)
{
Command.Connection.Open();
OdbcDataReader reader = Command.ExecuteReader(CommandBehavior.Default);
List<T> tList = new List<T>();
while (reader.Read())
{
tList.Add(transformFunction(reader));
}
Command.Connection.Close();
return tList;
}
}
Вот пример функции преобразования, которая создаст экземпляр типа T для каждой строки в запросе. В данном случае это просто объект Foo,
public class Foo
{
public Foo() { }
public string FooString { get; set; }
public int FooInt { get; set; }
}
class Program
{
public static List<Foo> GetFooList(string connectionString, string cmdText)
{
OdbcQuery query = new OdbcQuery(new OdbcConnection(connectionString), cmdText);
List<Foo> fooList = query.Transform(
rdr =>
{
Foo foo = new Foo();
foo.FooInt = rdr.GetInt32(0);
foo.FooString = rdr.GetString(1);
return foo;
});
return fooList;
}
Это должно работать хорошо, потому что ваши доменные объекты создаются при первом обходе результатов базы данных, не требуется второй или третий этапы перевода.