Выбор выберет дочерние объекты путем издания нового запроса к базе данных для них. Соединение выберет дочерние объекты путем присоединения к ним в запрос родителя. Так вот почему Вы видите подобную производительность, даже с понижением количества запросов.
Выбор:
SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)
Соединение:
SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)
относительно того, когда использовать один по другому... Не цельный уверенный. Это, вероятно, зависит от системы баз данных. Если бы Вы были всегда лучше, чем другой, я сомневаюсь, что они потрудились бы давать Вам опцию! Если бы Вы видите подобную производительность для каждого, я не волновался бы об этом.
Проблема в том, что Margin действительно имеет тип "System.Windows.Thickness", который является НЕ объект зависимости, поэтому Left, Top, Right и Bottom НЕ являются свойствами зависимостей и, следовательно, не могут быть анимированы с помощью DoubleAnimation (что позволяет использовать анимацию).
Для анимации Margin используется ObjectAnimation, которая не выполняет анимацию. Вот почему вы видите, как маржа перескакивает с исходного положения на новое. Другой распространенный пример:
Бен Леммон дает элегантное решение: http://blogs.msdn.com/blemmon/archive/2009/03/18/ animating-margins-in-silverlight.aspx