IQueryable 到底是什么意思?

What exactly does IQueryable mean?

我不确定我是否理解 IQueryable 到底是什么。

我知道它不会获取所有实体并将约束部分放在内存中,而是将其作为发送到数据库的命令的一部分执行。

如果我弄错了请指正并告诉我,为什么我的存储库功能 return IQueryable 而不是简单的 List?

IQueryable实际上并不是实体的集合,而是描述了如何获取该集合。在您通过将数据转换为 IEnumerable 或类似的东西来对其进行评估之前,永远不会从源中检索数据。

从您的存储库返回 IQueryable 的优点是您的调用代码可以在查询进入数据库之前指定额外的 .Where 子句。如果你返回一个IEnumerable,你的代码会从数据库中检索一个table的所有值,然后在内存中执行过滤,这是低效的。

IQueryable 和 IQueryable<T> 是封装 LINQ 表达式的抽象;然后,LINQ 提供程序使用这些表达式 - 就像 Entity Framework 使用的那样 - 将这些表达式转换为 SQL,然后将其发送到数据库。不同的 LINQ 提供程序以不同方式解释 LINQ 表达式,例如,MongoDB 将这些表达式转换为 JSON 查询。

IQueryable 仅在调用 "terminal" 方法时才被评估,例如 ToList()ToArray()Single()SingleOrDefault()First()FirstOrDefault()Count()Any() 等。这是提供者快速介入并进行翻译的时候。 Microsoft 包含一个 LINQ 提供程序,它不对任何内容进行转换,而是在内存中运行。这是通过调用扩展方法 AsQueryable().

IEnumerable<T> 转换为 IQueryable<T> 时使用的方法