У меня есть метод службы, который возвращает список аннотаций пользователей:жадной загрузка вложенного свойства не работает в Entity Framework 6
public IEnumerable<UserSummary> GetUserSummaries()
{
return Users.Include(u => u.BillingAddress)
.Include(u => u.BillingAddress.Country)
.OrderBy(u => u.Email).Select(u => new UserSummary
{
Id = u.Id,
UserName = u.UserName,
Email = u.Email,
BillingAddress = u.BillingAddress,
Approved = u.Approved,
Admin = u.Admin,
Roles = u.Roles.Select(r => r.Name)
});
}
Эта проблема у меня в том, что BillingAddress.Country
не хочет заряжание, как я 'явно указано. Поскольку я не делаю .ToList()
, я получаю InvalidOperationException: уже открыт DataReader, связанный с этой командой, который должен быть закрыт первым.
Если я делаю ToList()
, исключение уходит, но вместо 1 запроса он становится n + 1 запросами, потому что он ленивый загружает страну.
Как я могу загрузить страну для BillingAddress и избежать n + 1 запросов?
Update: У меня было подозрение, что, потому что я не проецируя Country
на в UserSummary
он игнорируется, несмотря на явно включены. Я добавил свойство Country
классу UserSummary
и проецировал страну на него. Теперь он включен в исходный запрос.
Есть ли способ заставить его загрузить в UserSummary.BillingAddress.Country
, а не включать его как отдельную собственность?
Попробуйте использовать '.INCLUDE (и => u.BillingAddress.Select (а => a.Country))' –
Если я не хватает специальной Linq ссылки, 'Select', кажется, только доступен по коллекциям. – Sam