EF中不支持 自定义查询返回IEnumerable<dynamic>吗? 不会这么弱吧?
项目中用的NH,加上现在关注的EF,都存在自定义查询的实体问题,也就是自定义查询时需要创建一个业务实体,那么这样的话尤其是对于数据管理平台来说Model层会相当庞大,我就体会到了。
今天在萧秦的博客中发现他用到了这个方法,即直接返回IEnumerable<dynamic>, 经请教后,他说用的是fluent Data ORM, 这个ORM是支持dynamic的, 那么我就奇怪难道EF真的不支持。
我写了个测试代码,发现,如果在EF中这样使用,其实dynamic就被理解为object. 看看大家遇到过累死的烦恼没?
string sql = @"select a.ID as FID,a.MODULENAME as FMODULENAME,a.ICON as FICON,b.ID as CID,b.MODULENAME as CMODULENAME,b.ICON as CICON,b.URL from (
select * from
b_commission a where a.pid=0
) a
inner join
(
select * from B_COMMISSION a where a.PID<>0
) b
on a.ID=b.PID";
IEnumerable<dynamic> list = db.Database.SqlQuery<dynamic>(sql);
foreach (var item in list)
{
//此时会报错,提示object未包含FID的定义。
Console.WriteLine(item.FID);
}
------解决方案--------------------你的场合可以使用IEnumerable<Dictionary<string,object>>替代,至于是否支持不清楚,但是dynamic类型不适合在集合中使用,效率非常低,还不如用DataTable这样的弱类型替代了。
------解决方案--------------------你对dynamic的理解并没有原则性的错,而是欠缺。
foreach (dynamic item in list)
------解决方案--------------------不知道你写的 db.Database.SqlQuery<dynamic>(sql) 这个的实现代码是什么,因此不知道其意义。请贴出其代码来。
------解决方案--------------------你可以用dynamic linq。