EF架构~看看下面这代码,你还敢用它的延时加载吗?
linq to entity或者linq to sql都提供了非常方便的延时加载功能,什么意思?就是说在建立对象时,它会将数据库中的表关系同时建立进来,然后在查询时,如果用到的外键表的数据,才会建立这个外键表的查询,这一点确实很“酷”,但是它是有代价的,甚至代价是巨大的。
我一直不太喜欢我命运被别人去掌握着,写代码也一样,说着很好听的“延时加载”,用着也算方便,但对于它生成的SQL代码却是让我很恐惧的,下面看一下截图:
这是一个查出10条结果的语句
这只是一部分,它对于建立SQL的connection是10次,傻眼了吧,呵呵,这绝对是不能接受的,但如果你不用外键表,它是很正常的,一个SQL链接就搞定了,当然这是正常的。
其时,EF把复杂查询进行了封装,在它看来叫“延时加载”,对我来说就是关系表的复杂查询,有时我们应该把它提出来,自己去写这个LINQ语句,而不用系统所畏的“延时加载”,下面是自己写的LINQ语句的结果:
恩,自己写的查询结果,是我们可以接受的,也是我们可以控制的,呵呵。