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>
时使用的方法
我不确定我是否理解 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>
时使用的方法