EF中IQueryable<>.Select自定义的问题。

steden 2014-06-17 03:53:15
是这样的,
IQueryable<>.Select(o=>new{o.ID,o.Name}) 返回的是一个匿名对象。

但我这边,希望是这样的,不管我select什么字段。我仍然希望返回的是一个实体类型。而不是创建了一个新的匿名对象。

举个例子:
DbContext.DbSet<UserDB>.Select(o=>new{o.ID,o.Name}).Where(o=>o.XXX = "XXX").ToList()

我希望这边返回的是List<UserDB>类型。
即没有被Select到的对象,为默认值。
于此同时,不能因为这里,而“特殊”去创建一个这么的类。


我尝试自定义构建表达式树,结果还是失败了。明显提到的也是XX类型不能转换为XX类型。

请问有什么办法吗?

另外在介绍下背景。
我这边是通过:
UserDb.Data.Select().Where().ToXXX();

其中UserDB.Data 是自定义的一种类型。返回一系列我要的方法。比如常见的 Select、Where等等。都是自己写的方法。
...全文
1007 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mnxm 2014-12-11
  • 打赏
  • 举报
回复
IQueryable<>.Select(o=>new UserDB(){id = o.ID,name = o.Name}) .ToList();
steden 2014-12-11
  • 打赏
  • 举报
回复
引用 8 楼 yixian2007 的回复:
这个也是我想学习的,帮顶。 我目前想到的做法是使用List<T>,自己添加进来,使用IQueryable或者其它什么的,似乎得不到。
你实现了吗?
yixian2007 2014-06-17
  • 打赏
  • 举报
回复
这个也是我想学习的,帮顶。 我目前想到的做法是使用List<T>,自己添加进来,使用IQueryable或者其它什么的,似乎得不到。
steden 2014-06-17
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
如果是按你的想法,差不多也可以办到,不过表达式构造上,你的更改表达式树的顺序,得把select token放到最后,而不是最前面
谢谢你的回答,不过这个表达树返回的类型还是List<匿名> 不是我想要的。 我是希望能改过ef操作数据库select 字段部份。而不影响到返回的实体。没有显示使用的字段,统一为null或者字段默认值。
wanghui0380 2014-06-17
  • 打赏
  • 举报
回复
如果是按你的想法,差不多也可以办到,不过表达式构造上,你的更改表达式树的顺序,得把select token放到最后,而不是最前面
steden 2014-06-17
  • 打赏
  • 举报
回复
引用 2 楼 wanghui0380 的回复:
额,你就不能先where后select么?? 其实select地意思在linq里其实不是“选择”而是“重映射”,所以这个属于你自己使用上地毛病
我知道是投影的。所以我并不直接用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方法。只不过是使用“字符串”的形式去组合(结果返回的类型还是投影的)。所以肯定不能这样使用。
wanghui0380 2014-06-17
  • 打赏
  • 举报
回复
非要如此,你 xxx.select(o=>o)就可以了,问题是这样木有意义,如果是这样你还不如直接返回xxx
steden 2014-06-17
  • 打赏
  • 举报
回复
引用 1 楼 huwei001982 的回复:
IQueryable<>.Select(o=>new UserDB{o.ID,o.Name})
语法错误的。
wanghui0380 2014-06-17
  • 打赏
  • 举报
回复
额,你就不能先where后select么?? 其实select地意思在linq里其实不是“选择”而是“重映射”,所以这个属于你自己使用上地毛病
huwei001982 2014-06-17
  • 打赏
  • 举报
回复
IQueryable<>.Select(o=>new UserDB{o.ID,o.Name})

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧