溶入海洋中的雨滴
将自己溶入大海,化作一阵清风
项目中用ADO Entities  Framework来作为数据库表和实体的映射框架,对单表到3个关联表的增、删、改和查询操作,不用再用代码生成器去生成实体类和数据库操作类,简单逻辑功能实现起来,几乎不用写sql语句、存储过程,感觉开发起来提高了不少效率。但是有个跨多达6个表进行查询的,平均每个表的记录不到2000条,分页查询时,在进行统计满足条件的记录数时,就死在那了,直至net报数据库执行超时。对比存储过程实现同等功能的执行效率,怀疑entities  framework进行跨多表查询效率不行,用来做单表或跨2个表的操作还可以,跨多表操作建议还是用回存储过程吧。 
代码如下:
int count = 0;

            
using (var context = new DBEntities(DateCommand.ConnectionString))
            {

                var result 
= from inner in context.InnerJoin
                             join ph 
in context.PathologyHead on inner.PathologyHeadID equals ph.ID
                             join pt 
in context.PathologyHeadDetailTestItem on inner.PathologyHeadDetailTestItemID equals pt.ID
                             join sp 
in context.Specimen on inner.SpecimenID equals sp.ID                   
                             join r 
in context.Receive on inner.ReceiveID equals r.ID
                             select sp.SpecimenNumber;


                
if (result.Count() > 0)
                {

                    count 
= result.Count();
                }
            }
            
return count;
 
 
以上逻辑我改用sql2005通用存储过程分页来实现,同时在InnerJoin表增加插入10W条记录,测试发现按每页取10条记录计,执行前都清空db数据缓存和编译缓存,执行10次,cpu执行时间没有超过4S的,页面执行时的反应速度只第一次要4-6S左右,之后都是2、3s就可以显示记录。
        网上对entities  framework的多表查询方面资料很少,msdn也没发现对此种问题的说明,留档做一记录,entities  framework用来做单表或跨2个表的操作还行,跨多表操作还是用回存储过程。 
posted on 2009-12-22 14:27  溶入海洋中的雨滴  阅读(713)  评论(2编辑  收藏  举报