我希望IQueryable<User>
成为POCO。我的存储库中有两个函数将O / RM转换为POCO,反之亦然。这在保存或获取一个用户时工作正常,但是如何获得用户的IQueryable呢?
public IQueryable<Domains.User> GetUsers()
{
// This wont work because it can't convert to a store expression
return context.JUsers.Select(u => ConvertUserORMToDomain(u));
}
我是否必须在每个IQueryable方法中手动重写每个POCO域的转换?如果是这样的话,我会没有模式会更好。
转换器:private Domains.User ConvertUserORMToDomain(ORM.JUser ormUser)
答案 0 :(得分:2)
好几点。
您正在使用Entity Framework,那么为什么需要将ORM对象投影到DTO?如果您使用纯POCO,那么您根本不需要任何投影。
如果你想继续做你正在做的事情,你需要一个中间层来调解你的ORM对象和你的POCO。
例如,您的存储库:
public IQueryable<JUser> GetUsers() // Note how it returns JUser, not the POCO
{
return context.JUsers;
}
然后你的服务:
public Domains.User GetUserById(int userId)
{
return repository
.GetUsers() // IQueryable<JUser>
.Where(x => x.UserId == userId) // filter based on business req
.ToList() // materialize query on server
.Select(u => ConvertUserOrmToDomain(u)); // project into POCO
}
换句话说,您需要一位知道如何根据业务需求实现查询的管理器(在这种情况下,让用户获取id),以及如何将对象转换为域实体。
正如我所说,这是浪费时间IMO - 使用POCO直接表示您的域模型,然后您不需要转换过程。