我正在开发项目,其中数据库存储库的编码如下:
public List<UserDTO> ShowAll()
{
return OnConnect<List<UserDTO>>(db =>
{
IEnumerable<User> users = db.Users;
return users.
ToListUserDTO();
});
}
public List<AnotherUserDTO> ShowAll()
{
return OnConnect<List<AnotherUserDTO>>(db =>
{
IEnumerable<User> users = db.Users;
return users.
ToAnotherUserDTO();
});
}
public TReturn OnConnect<TReturn>(Func<BankManagerDockAuthorizationEntitiesWrapper, TReturn> action)
{
TReturn result = default(TReturn);
OnConnect(db =>
{
result = action(db);
});
return result;
}
现在,如果我只想从数据库中获取用户的ID,则必须创建另一个将运行ToUsersWithJustIdDTO()
的方法。在Fourse中,我可以执行以下操作:
var users = repo.ShowAll()
.Select(x => new UserViewModel
{
Id = x.Id
})
.ToList();
但是ShowAll()
将运行巨大的sql查询并获得有关User的所有信息。那就不好了。
对我来说,最好的解决方案是创建通用方法ShowAll
,该通用方法T
类型和users
将自动映射到该T
类型,如下所示: / p>
IEnumerable<UserViewModel> users1 = repo.ShowAll<UserViewModel>();
IEnumerable<AnotherUserViewModel> users1 = repo.ShowAll<AnotherUserViewModel>();
但是我真的不知道该怎么做。我管理的是从存储库中检索IQueryable
,然后选择,就像这样:
public IQueryable<User> GetUsers()
{
return OnConnect<IQueryable<User>>(db =>
{
return db.Users;
});
}
和用法:
var users = repo.GetUsers() // its IQueryable, so query is not launched yet
.Select(x => new UserViewModel
{
Id = x.Id,
})
.ToList();
现在它应该只运行SELECT Id from Users
..但这不起作用。我不能这样做:GetUsers
之后上下文已关闭,而我不能这样做Select
。我还能做什么?