Поскольку это исходит от БД, обходы базы данных, скорее всего, приведут к снижению производительности. Также сравнение ParentDog.Key==ChildDog.Key
может быть выполнено в SQL, так что вы не извлекаете все эти данные в свое приложение только для того, чтобы их отбросить.
Перепроектируйте его так, чтобы вы сделали один выбор, чтобы получить все данные в одном запросе.
Альбин упомянул AddRange, но вы даже можете пойти дальше и виртуализировать свою сетку, чтобы она вытягивала строки, отображаемые пользователю, только когда она смотрит на эту часть сетки.
EDIT
Чтобы сгенерировать ваш список, вам нужно вернуть что-то подобное из БД:
Parent1, null, null
Parent1, Child1, 110
Parent1, Child12, 12
Parent2, null, null
Parent2, Child21, 23
Parent2, Child22 ,20
Leaf1, null, 20
Leaf2, null, 34
Похоже, вам нужен какой-то left join
и count
, с потенциалом union all
.