Вы можете либо расширить класс команд и конструктор принимает выражения для навигационных свойств включать:
private string _userName;
private MyContext _context;
private Expression<Func<User, object>>[] _includes;
public FetchUserByUsernameServiceCommand(string userName,
MyContext context, params Expression<Func<User, object>>[] includes)
{
_userName = userName;
_context = context;
_includes = includes;
}
public User Execute()
{
IQueryable<User> query = _context.Users;
if (_includes != null)
{
foreach (var include in _includes)
query = query.Include(include);
}
return query.SingleOrDefault(u => u.UserName);
}
Вы назвали бы это так:
User user = new FetchUserByUsernameServiceCommand(
Username, Context, u => u.JoinedGroups.Select(g => g.Image))
.Execute();
var groupList = user.JoinedGroups.ToList();
return groupList;
Или вас может использоваться явная загрузка:
User user = new FetchUserByUsernameServiceCommand(
Username, Context)
.Execute();
var groupList = Context.Entry(user).Collection(u => u.JoinedGroups).Query()
.Include(g => g.Image)
.ToList();
return groupList;
Обратите внимание, что только первый вариант - загруженная загрузка в том смысле, что пользователь плюс группы плюс изображения загружаются вместе в одном запросе базы данных. Второй вариант (явная загрузка) будет запускать два запроса к базе данных - первый, который загружает только объект User
в исполнитель команды, а второй - загружает группы плюс изображения для этого пользователя.
Можете ли вы поместить фрагмент кода для своей модели «Группа»? – Sampath