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

时间:2011-04-02 14:41:51

标签: c# .net

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

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

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

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

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

4 个答案:

答案 0 :(得分:9)

您必须对翻译进行硬编码,或者必须先将其转换为IEnumerableIQueryable表示表达式树转换为使用过的提供程序中的某些执行 - 在您的情况下,我相信它将是实体框架。您不能在此类查询中使用任何自动映射,因为它将被转换为SQL,无法理解您的.net方法或AutoMapper。对自定义类型的预测是查询的一部分,必须进行硬编码。您可以为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不能是映射实体。

答案 1 :(得分:4)

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

自动映射是一种技术。

答案 2 :(得分:4)

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

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

可选

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

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

答案 3 :(得分:0)

这个问题已有9年历史了,因此idk如果存在的话就存在了,但是对于现在正在搜索的任何人,如果您选择一个用户,则使用.FirstOrDefault()即可。