从数据库检索数据时自动映射对象

时间:2018-06-27 07:51:55

标签: c# entity-framework

我正在开发项目,其中数据库存储库的编码如下:

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。我还能做什么?

0 个答案:

没有答案