将IQueryable 对象转换为另一个对象?
问题描述:
我不知道是什么关键字所以这里是我想要的一个例子:将IQueryable <T>对象转换为另一个对象?
return from i in userRepo.GetUsers()
select new SimpleUser{
i.UserId,
i.Name
};
userRepo.GetUsers()
返回一个类型IQueryable<User>
。我想将其转换为IQueryable<SimpleUser>
,以便我可以限制访问User
域的某些属性。
如何在不对这种翻译进行硬编码的情况下做到这一点?像automapper或ValueInjecter这样的工具怎么样,他们如何做到这一点?
此外,这种技术叫什么?
答
您必须对翻译进行硬编码,或者您必须先将其转换为IEnumerable
。 IQueryable
表示将表达式树翻译为用过的提供程序中的一些执行 - 在您的情况下,我相信它将是实体框架。你不能在这样的查询中使用任何自动映射,因为它将被转换为不理解你的.net方法或AutoMapper的SQL。对自定义类型的投影是查询的一部分,并且必须进行硬编码。您可以创建自定义的扩展方法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
的情况下,不能是映射的实体。
答
AutoMapper是你想要的工具;它通过反射进行工作,除非您告诉它不这样做,否则它将直接映射具有相同名称的属性。
自动映射是技术。
答
只要SimpleUser是assigneable到用户(是SimpleUser的基类的接口),可以
var users = simpleUsers.Cast<User>();
任选
var users = simpleUsers.Cast<User>().AsQueryable();
如果你不确定是否所有项目实际上是用户,那么你可以用OfType<User>
代替Cast<User>
代码“u => u新的SimpleUser”不能编译。我认为第二个“你”需要被删除。 – 2013-06-04 00:29:54
@Nate:是的,你说得对。这是错字。 – 2013-06-04 09:46:32