将IQueryable 对象转换为另一个对象?

我不知道关键字是什么,所以这里是我想要的一个例子:

return from i in userRepo.GetUsers() select new SimpleUser{ i.UserId, i.Name }; 

userRepo.GetUsers()返回IQueryable类型。 我想将其转换为IQueryable以便我可以限制对User域的某些属性的访问。

如果不对此类翻译进行硬编码,我该怎么办呢? 那些像automapper或ValueInjecter这样的工具怎么样呢?

此外,这项技术叫做什么?

您必须对翻译进行硬编码,或者必须先将其转换为IEnumerableIQueryable表示表达式树转换为使用过的提供程序中的某些执行 – 在您的情况下,我相信它将是Entity框架。 您不能在此类查询中使用任何自动映射,因为它将被转换为无法理解您的.net方法或AutoMapper的SQL。 对自定义类型的预测是查询的一部分,必须进行硬编码。 您可以为IQueryable创建自定义扩展方法,并在需要的地方重用它:

 public static IQueryabe ProjectToSimpleUser(this IQueryable query) { return query.Select(u => new SimpleUser { // Here map your fields }); } 

现在你可以使用:

 return repo.GetUsers().ProjectToSimpleUser(); 

在Entity框架的情况下, SimpleUser不能是映射实体。

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

自动映射是一种技术。

如果SimpleUser是User的用户(User是SimpleUser的基类的接口),你可以

  var users = simpleUsers.Cast(); 

任选地

  var users = simpleUsers.Cast().AsQueryable(); 

如果您不确定所有项目是否都是实际用户,则可以使用OfType而不是Cast