Итак, у вас есть id
, и вы хотите, чтобы единственный пользователь, имеющий этот идентификатор в качестве первичного ключа, вместе со своим адресом и своим PlzOrt.
Всякий раз, когда вы запрашиваете, используйте Выбрать, чтобы получить данные. Используйте Включить, только если вы хотите обновить извлеченные данные.
Причина выбора в том, что у вас больше свободы в выборе. Кроме того, вы можете ограничить извлекаемые данные: если вы запрашиваете у школ своих учеников, вы знаете, что у каждого ученика школы 10 будет внешний ключ SchoolId, равный 10. Так зачем извлекать этот внешний ключ для каждого из учеников школы 1000?
Я не знаком с возможностями ef-core. Знает ли он, что если вы выберете одно из виртуальных свойств, для которого необходимо (групповое) соединение? В этом случае проще использовать Select.
Если вам придется делать свои объединения самостоятельно:
var requestedUserWithAddresAndPlz = dbContext.Users.
// keep only the user with id
.Where(user => user.IdUser == id)
// every User has exactly one Address: use a normal join
.Join(dbContext.Addresses,
user => user.IdUser, // from every User take IdUser
address => addres.IdAddress, // from every Address take IdAddress
// result selector: take the user with its address to make one new
(user, address) => new
{
// Select only the User properties you plan to use
Id = user.IdUser,
Name = user.Name,
...
Address = new
{
// again: select only the properties you plan to use
// no need to select IdAddress, you know the value!
Street = address.Street,
HouseNumber = address.HouseNumber,
// to fetch the Plz: fetch the one-and-only PlzOrt with address.FidPlzOrt
Plz = dbContext.PlzOrts
.Where(plzOrt => plzOrt.PlzOrdIt == address.FidPlzOrt)
.FirstOrDefault(),
})
.FirstOrDefault();
Примечание. Я использовал анонимные типы для большей свободы выбора только тех свойств, которые я планирую использовать. Я также могу дать своим свойствам имена, которые я хочу.
Недостаток: вы не можете использовать анонимные типы в качестве возвращаемых значений. Если вам действительно нужно это за пределами вашей функции, используйте создать класс, содержащий ваши данные, и используйте новый SomeClass (). Преимущество: если ваша база данных изменяется, SomeClass не нужно менять, и поэтому ваши абоненты не заметят изменения в вашей базе данных.