这是我现有的代码,它提取用户并获取他的组。
User user = new FetchUserByUsernameServiceCommand(Username, Context).Execute();
var groupList = user.JoinedGroups.ToList<Group>();
return groupList;
每个Group
都有一个导航属性Image
,其中包含ImageUrl
。
我想Include
Image
中Group
的{{1}} groupList
,但Include
上Lis<Group> groupList
不可用,因为Context
它没有附加到Image
。
如何为每个Group
添加{{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
对象,第二个加载组加上该用户的图像。