将IQueryable 对象转换为另一个对象?
我不知道关键字是什么,所以这里是我想要的一个例子:
return from i in userRepo.GetUsers() select new SimpleUser{ i.UserId, i.Name };
userRepo.GetUsers()
返回IQueryable
类型。 我想将其转换为IQueryable
以便我可以限制对User
域的某些属性的访问。
如果不对此类翻译进行硬编码,我该怎么办呢? 那些像automapper或ValueInjecter这样的工具怎么样呢?
此外,这项技术叫做什么?
您必须对翻译进行硬编码,或者必须先将其转换为IEnumerable
。 IQueryable
表示表达式树转换为使用过的提供程序中的某些执行 – 在您的情况下,我相信它将是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