IEnumerable和IQueryable在使用时的区别

时间:2023-03-09 17:31:34
IEnumerable和IQueryable在使用时的区别

最近在调研数据库查询时因使用IEnumerable进行Linq to entity的操作,造成数据库访问缓慢。此文讲述的便是IEnumerable和IQueryable的区别。

微软对IEnumerable的定义使用场景为Linq to Object,也就是涉及到内存操作时使用。而对IQueryable的定义使用场景为Linq to SQL(Entity)。

因此,在执行Linq to SQL(Entity)的操作时,如果使用IEnumerable则会造成全表查询。如下图Code:

    IEnumerable和IQueryable在使用时的区别

  如此,在SQL Profile监测到的执行语句为两次全表查询。

    IEnumerable和IQueryable在使用时的区别

    IEnumerable和IQueryable在使用时的区别

  然而,当我们正确使用IQueryable或者var时,如下图Code:

    IEnumerable和IQueryable在使用时的区别

  得到的查询语句为:

    IEnumerable和IQueryable在使用时的区别

为了一探IEnumerabel和IQueryable在实际工作中的程序执行效率,总结来下图的时间对比:

  IEnumerable和IQueryable在使用时的区别

在这张图上看到的时间单位虽然为毫秒,但这是代码同步执行语句的查询时间,但多个客户端同时访问数据库时,此时造成的数据访问速度就不再是毫秒了。