Вы писали:
, которые ... две таблицы в базе данных, связанные с внешним ключом
Это похоже на отношение: внешний ключ в одномТаблица ссылается на первичный ключ другой таблицы.
Например, школа со множеством учеников. Если ученик с первичным ключом [10] посещает школу с первичным ключом [8], то ученик [10] имеет внешний ключ SchoolId со значением [8]
Вы также написали:
... и некоторые Объекты затем будут использовать один и тот же внешний ключ
Это немного сбивает с толку. Кажется, вы имеете в виду, что элементы в этих двух таблицах имеют внешний ключ, который ссылается на один и тот же первичный ключ элемента в третьей таблице.
Например: если ученик [10] посещает школу[8] и учитель [25] преподает в школе [8], тогда и ученик, и учитель получат внешний ключ SchoolId со значением [8]
Ваш вопрос в том, что является более эффективным:извлечение данных из таблиц с использованием двух запросов и последующее их объединение, или позволить базе данных сделать это одним запросом.
Базы данных чрезвычайно оптимизированы для объединения записей из таблиц, особенно если эти записи ссылаются друг на друга с использованием стороннихключи. Одна из более медленных частей - передача данных запросов из системы управления базами данных в ваш локальный процесс.
Следовательно, целесообразно переносить только те свойства записей, которые вы фактически планируете использовать.
Теперь у вас, похоже, есть две таблицы, где все записи имеют внешний ключ, указывающий на первичный ключ элемента в третьей таблице, как в моем примере «Школы, учителя и ученики».
Обычно вы бызапросить школы, которые ...;каждая школа со своими учителями, которые ... и со своими учениками, которые ...;
Возможно, вы не хотите, чтобы все объекты принадлежали школам, учителям и ученикам. Кажется, вам не нужны какие-либо школьные свойства, только некоторые свойства учителей и свойства учеников.
Поскольку вы хотите сопоставить учеников, имеющих определенный SchoolId, с учителями, имеющими одинаковый SchoolId, было бы разумно неПередайте этот внешний ключ дважды: один раз для ученика школы [8] и один раз для учителя школы [8], поскольку они находятся в одной школе, вы знаете, что они будут иметь одинаковое значение.
Другойоптимизация: если у вас есть несколько учеников в школе [8] и несколько учителей в школе [8], почему бы не выполнить следующий запрос:
Дайте мне для всех школ, которые ..., первичный ключ(и, возможно, некоторые другие свойства), вместе со (некоторыми свойствами) всех Учеников, которые посещают эту Школу, и (некоторыми свойствами) всех Учителей, которые преподают в этой Школе
var results = dbContext.Schools
.Select(school => new
{
Id = school.Id,
Name = school.Name, // only if you want other School properties
...
// All Students that attend this School
// == that have a foreign key equal to School.Id
Students = dbContext.Students.Select(student => new
{
// Select only the properties that you plan to use
Id = student.Id,
Name = student.Name,
...
// not needed: you know the value:
// SchoolId = student.SchoolId,
})
.ToList(),
// all Teachers that teach on this School
// == that have a foreign key equal to School.Id
// == that have a foreign key equal to the foreign key of all Students on this School
Teachers = dbContext.Teachers.Select(teacher => new
{
// again: select only properties that you plan to use
Id = teacher.Id,
Name = teacher.Name,
...
// not needed: you know the value:
// SchoolId = teacher.SchoolId,
})
.ToList(),
});
В результате, вы знаете, что в школе с идентификатором [8] будут все учащиеся, у которых есть внешний ключ со значением [8], и все учителя, у которых есть внешний ключ со значением [8]