IQueryable<>.Select(o=>new UserDB{o.ID,o.Name}) 

解决方案 »

  1.   

    额,你就不能先where后select么??其实select地意思在linq里其实不是“选择”而是“重映射”,所以这个属于你自己使用上地毛病
      

  2.   

    非要如此,你xxx.select(o=>o)就可以了,问题是这样木有意义,如果是这样你还不如直接返回xxx
      

  3.   


    我知道是投影的。所以我并不直接用IQueryable<>.Select,而是自己写了一个select方法。
    我没表达清楚,抱歉,where在前在后,其实不是我要表达的主要目的,换句话说ef除了select可以筛选数据库读取的字段外,还有其它办法吗?(具我所知的话,就是额外构建表达树式了。)
    我的目的是能实现select xxxxxx,xxxx,xxx from table 的同时返回的是一个实体的整体。而不是投影过后的结果。赋上我动态构建的表达式树
    //创建表达式变量参数
                var parameter = Expression.Parameter(typeof(TInfo), "o");                               // o=>
                var property = Expression.Property(parameter, typeof(TInfo).GetProperty("ID"));        // ID
                var pred = Expression.Lambda(property, parameter);                                     // o=>o.ID            //组建表达式树:Select(c=>c.ContactName)
                var expr = Expression.Call(typeof(Queryable), "Select", new Type[] { typeof(TInfo), typeof(T) }, Expression.Constant(custs), selector);            //使用表达式树来生成动态查询
                return Query.Provider.CreateQuery(expr);
    以上的动态,其实也还是call了queryable的select方法。只不过是使用“字符串”的形式去组合(结果返回的类型还是投影的)。所以肯定不能这样使用。
      

  4.   

    如果是按你的想法,差不多也可以办到,不过表达式构造上,你的更改表达式树的顺序,得把select token放到最后,而不是最前面
      

  5.   


    谢谢你的回答,不过这个表达树返回的类型还是List<匿名> 不是我想要的。
    我是希望能改过ef操作数据库select 字段部份。而不影响到返回的实体。没有显示使用的字段,统一为null或者字段默认值。
      

  6.   

    IQueryable<>.Select(o=>new UserDB(){id = o.ID,name = o.Name}) .ToList();