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语句到数据库服务器中去执行