日期:2014-05-17  浏览次数:20959 次

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。