我正在尝试使用存储库模式构建Web应用程序。这样做时,我注意到导航属性没有加载。我可以使用EF代理加载属性,但是当我使用DTO时,确实不喜欢这样。从那以后,我删除了所有代理代码,并决定只需要提供一种方法即可急切加载我关心的数据。
在我的存储库中,我有一个与此类似的界面。通过使用DBSet,我可以使用Find方法来一般地找到该值并从存储库中返回它。这样做,我无法传递Includes来解析导航属性。
public async Task<T> GetById(int Id)
{
var query = await this.Context.Set<T>().FindAsync(Id);
// Left split like this for clarity
return query;
}
我完成这项工作的唯一方法是删除通用部分,然后在UserRepository中添加一个名为GetUserById的新方法。
public class UserRepository : RepositoryBase<User>, IUserRepository
{
private readonly Context _context;
public UserRepository(Context context) : base(context) {
_context = context;
}
public User GetUserById(int Id)
{
var query = _context.Users.Include("Department").Where(x => x.Id == Id).FirstOrDefault();
return query;
}
}
请告诉我有更好的方法。
答案 0 :(得分:0)
尝试此GetUserById
实现:
public User GetUserById(int Id, params Expression<Func<User, object>>[] includes)
{
var query = _context.Users.Where(x => x.Id == Id);
foreach (var include in includes)
{
query.Include(include);
}
return query.FirstOrDefault();
}
这就是您的称呼方式:
var repo = new UserRepository();
var user = repo.GetUserById(100, u => u.Department);