Если честно, то элегантностью ваше решение уж точно не отличается (извините за критику). Если по вашей выборки у контакта будет по 3 связанных записи, то результат составит 27 строк, что как по мне далеко не является идеалом.
Если вам необходимо получить связанные записи по одному контакту, то можно воспользоваться следующим трюком -
https://community.dynamics.com/crm/b...etrieve-method
Если этот вариант - не вариант я бы для экономии времени просто разрезал ваши запросы на 3 части (без страшных джоинов) и упаковал бы всё в пакет -
https://msdn.microsoft.com/en-us/lib...or=-2147217396