Если информация в таблицах имеет какой-либо общий идентификатор, вы должны использовать соединение напрямую или через хранимую процедуру.
С правильными показателями производительность не будет проблемой, я полагаю, если бы у вас был объем данных, который мог бы вызвать проблему, вы бы, вероятно, упомянули об этом, поскольку мы тогда говорили бы об огромных объемах данных, миллионах строк в как минимум.
Если у вас возникают проблемы с производительностью, это, скорее всего, связано с отсутствием или неправильностью индексов, или с неправильным запросом, и тогда вы можете вернуться с конкретным вопросом о том, как оптимизировать этот запрос:)
Если, с другой стороны, данные не поддаются объединению, возможно, вам нужно обработать данные из одной таблицы, чтобы узнать, с чем связываться в других, тогда вы можете создать классы для хранения данных в c # во время выполнения. соответствующие.
Если вы используете как минимум 3,5 из c #, вы можете использовать Linq для присоединения к полученным структурам данных после анализа данных.
Если вы используете c # 2.0, вы можете использовать все хранимые процедуры для сопоставления и, возможно, использовать временные таблицы, к которым вы присоединяетесь, или переменные таблиц, или, возможно, функцию с табличными значениями, которая анализирует одну таблицу и возвращает новую таблицу, которую вы может присоединиться.