我不知道关键字是什么,所以这里是我想要的一个例子:
return from i in userRepo.GetUsers()
select new SimpleUser{
i.UserId,
i.Name
};
Run Code Online (Sandbox Code Playgroud)
userRepo.GetUsers()返回类型IQueryable<User>.我想将其转换IQueryable<SimpleUser>为我可以限制对User域的某些属性的访问.
如果不对此类翻译进行硬编码,我该怎么做?那些像automapper或ValueInjecter这样的工具怎么样呢?
此外,这项技术叫做什么?
Lad*_*nka 10
您必须对翻译进行硬编码,或者必须先将其转换为IEnumerable.IQueryable表示表达式树转换为使用过的提供程序中的某些执行 - 在您的情况下,我相信它将是实体框架.您不能在此类查询中使用任何自动映射,因为它将被转换为SQL,无法理解您的.net方法或AutoMapper.对自定义类型的预测是查询的一部分,必须进行硬编码.您可以创建自定义扩展方法IQueryable并在需要的地方重复使用:
public static IQueryabe<SimpleUser> ProjectToSimpleUser(this IQueryable<User> query)
{
return query.Select(u => new SimpleUser
{
// Here map your fields
});
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用:
return repo.GetUsers().ProjectToSimpleUser();
Run Code Online (Sandbox Code Playgroud)
如果Entity框架SimpleUser不能是映射实体.
只要 SimpleUser 可以赋值给 User(User 是 SimpleUser 基类的接口),就可以
var users = simpleUsers.Cast<User>();
Run Code Online (Sandbox Code Playgroud)
可选地
var users = simpleUsers.Cast<User>().AsQueryable();
Run Code Online (Sandbox Code Playgroud)
如果您不确定所有项目是否实际上都是用户,那么您可以使用OfType<User>代替Cast<User>