在EF5 / 6中包含导航属性的导航属性

时间:2014-02-10 11:34:09

标签: entity-framework entity-framework-5 entity-framework-6

这是我现有的代码,它提取用户并获取他的组。

        User user = new FetchUserByUsernameServiceCommand(Username, Context).Execute();

        var groupList = user.JoinedGroups.ToList<Group>();

        return groupList;

每个Group都有一个导航属性Image,其中包含ImageUrl

我想Include ImageGroup的{​​{1}} groupList,但IncludeLis<Group> groupList不可用,因为Context它没有附加到Image

如何为每个Group添加{{1}}导航属性?

1 个答案:

答案 0 :(得分:0)

您可以 扩展您的命令类和构造函数,以接受要包含的导航属性的表达式:

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对象,第二个加载组加上该用户的图像。