将IQueryable <T>对象转换为另一个对象?

Sha*_*ean 7 .net c#

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

return from i in userRepo.GetUsers()
  select new SimpleUser{
        i.UserId,
        i.Name
  };
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lad*_*nka 10

您必须对翻译进行硬编码,或者必须先将其转换为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
        });
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

return repo.GetUsers().ProjectToSimpleUser();
Run Code Online (Sandbox Code Playgroud)

如果Entity框架SimpleUser不能是映射实体.


seh*_*ehe 6

只要 SimpleUser 可以赋值给 User(User 是 SimpleUser 基类的接口),就可以

 var users = simpleUsers.Cast<User>();
Run Code Online (Sandbox Code Playgroud)

可选地

 var users = simpleUsers.Cast<User>().AsQueryable();
Run Code Online (Sandbox Code Playgroud)

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