Hi,
Simply iterate through the BlockTableRecord(s) in which you want to get entities and filter the entities accordin to your criterias.
This process is not slower than a SelectAll (which, internally, does the same).
Example to get all circles on layer "Foo" which radius is lower than 10.0
modelSpace
.Cast<ObjectId>()
.Where(id => id.ObjectClass.DxfName == "CIRCLE")
.Select(id => (Circle)id.GetObject(OpenMode.ForRead))
.Where(c => c.Layer == "Foo" && c.Radius < 10.0);