asp.net

IEnumerable与IQueryable区别

2024-01-14

1、IEnumerable 和 IQueryable的相同点

使用LINQ时,您会发现返回值IEnumerable和IQueryable,两者都对列表数据进行查询等操作。

IEnumerable和IQueryable是继承的关系,IQueryable 接口继承 IEnumerable 接口。


2、IEnumerable 和 IQueryable的区别

IEnumerable 和 IQueryable 都是 .NET 框架中提供的接口,用于表示可枚举的集合。但是,它们之间存在一些关键的区别。

IEnumerable 是所有可枚举对象的基接口,包括数组、集合、字符串等。它定义了基本的枚举操作,例如 GetEnumerator() 和 Count()。

IQueryable 是 IEnumerable 的扩展接口,它提供了 LINQ 查询的支持。IQueryable 中的查询操作会生成一个表达式树,该表达式树在执行时会转换为 SQL 查询。

假设数据库中有 1000 行。如果要使用 IEnumerable 创建这些行,.NET 会将所有行读取到内存中。它的写入、排序和过滤直接在内存中操作,因为所有信息都存在于内存中。使用 IQueryable 可以用 WHERE、SELECT、ORDER BY等对数据进行操作,并在数据端执行查询。

使用场景:

IEnumerable 适用于对内存中数据进行查询。

IQueryable 适用于对数据库、XML 文档等外部数据源进行查询。


lEnumerable:把数据取到内存中,在内存中查询

IQueryable:拼接好sql,直接从数据库中查询


那么什么时候选择使用IEnumerable 和 IQueryable呢?

在大多数情况下,我们应该使用 IEnumerable 来查询内存中的数据。如果需要查询外部数据源,例如数据库或 XML 文档,则应该使用 IQueryable。另外IQueryable可以使用强大的linq查询语法;可以执行延迟查询并将查询结果缓存起来,从而提高性能。


不同的WHERE方法

1、对普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。

2、普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。


IEnumerable在客户端内存中一条一条处理的,

IQueryable 翻译成sql语句扔到数据库服务器中去执行。

数据量较大的时候,IQueryable性能较高。

通常客户端评估的效率会低一些。

所以这就是 EFCore 都是采用IQueryable 版本中的方法的原因,因为这些操作会会翻译成sql语句到数据库服务器中去执行