将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这样的工具怎么样,他们如何做到这一点?

此外,这种技术叫什么?

您必须对翻译进行硬编码,或者您必须先将其转换为IEnumerableIQueryable表示将表达式树翻译为用过的提供程序中的一些执行 - 在您的情况下,我相信它将是实体框架。你不能在这样的查询中使用任何自动映射,因为它将被转换为不理解你的.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的情况下,不能是映射的实体。

+0

代码“u => u新的SimpleUser”不能编译。我认为第二个“你”需要被删除。 – 2013-06-04 00:29:54

+0

@Nate:是的,你说得对。这是错字。 – 2013-06-04 09:46:32

AutoMapper是你想要的工具;它通过反射进行工作,除非您告诉它不这样做,否则它将直接映射具有相同名称的属性。

自动映射是技术。

只要SimpleUser是assigneable到用户(是SimpleUser的基类的接口),可以

var users = simpleUsers.Cast<User>(); 

任选

var users = simpleUsers.Cast<User>().AsQueryable(); 

如果你不确定是否所有项目实际上是用户,那么你可以用OfType<User>代替Cast<User>