我不知道关键字是什么,所以这里是我想要的一个例子:
return from i in userRepo.GetUsers()
select new SimpleUser{
i.UserId,
i.Name
};
userRepo.GetUsers()
会返回IQueryable<User>
类型。我想将此转换为IQueryable<SimpleUser>
我可以限制对User
域的某些属性的访问。
如果不对此类翻译进行硬编码,我该如何做到这一点?那些像automapper或ValueInjecter这样的工具呢,他们怎么做呢?
此外,这种技术叫做什么?
答案 0 :(得分:9)
您必须对翻译进行硬编码,或者必须先将其转换为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
});
}
现在你可以使用:
return repo.GetUsers().ProjectToSimpleUser();
如果实体框架SimpleUser
不能是映射实体。
答案 1 :(得分:4)
AutoMapper是您想要的工具;它通过反射工作,除非你告诉它不这样做,它将直接映射具有相同名称的属性。
自动映射是一种技术。
答案 2 :(得分:4)
如果SimpleUser是User的用户(User是SimpleUser基类的接口),你可以
var users = simpleUsers.Cast<User>();
可选
var users = simpleUsers.Cast<User>().AsQueryable();
如果您不确定所有项目是否都是实际用户,那么您可以使用OfType<User>
代替Cast<User>
答案 3 :(得分:0)
这个问题已有9年历史了,因此idk如果存在的话就存在了,但是对于现在正在搜索的任何人,如果您选择一个用户,则使用.FirstOrDefault()即可。