Как видно и транзакция то не нужна...
Для 2008 это увы не так. метода ObjectClass у ObjectId нет. Соответственно приходится получить объект, а затем вызывать GetRXClass() объекта.
А я вынужден писать универсальный код. А так вы правы, будет быстрее, за счет уменьшения количества медленных методов tr.GetObject(id...)
Я использую свои доп классы для подключения к БД и управления транзакцией, но надеюсь смысл понятен из кода
using (DbConnection dwg = new DbConnection(DbFlag.Current))
{
        List<BlockTableRecord> blocks = dwg.GetBlocks(OpenMode.ForRead, false);
 
        RXClass dbText = RXClass.GetClass(typeof(DBText));
        int AttrCount = 0;
        Stopwatch timer1 = new Stopwatch();
        timer1.Start();
                        
        foreach (BlockTableRecord block in blocks)
        {
                foreach (ObjectId id in block)
                {
                        DBObject obj = dwg.GetObject(id, OpenMode.ForWrite, false, true);
                                                
                        if (obj.GetRXClass() == dbText) AttrCount++;
                }
        }
        timer1.Stop();
        long seconds = timer1.ElapsedMilliseconds;
        Logger.WriteMessage("Считано атрибутов-{0}/время-{1}", AttrCount, seconds);
}