【问题标题】:What exactly does IQueryable mean?IQueryable 到底是什么意思?
【发布时间】:2016-02-21 21:02:50
【问题描述】:

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

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

如果我弄错了,请纠正我并告诉我,为什么我的存储库函数应该返回 IQueryable 而不是简单的 List

【问题讨论】:

    标签: c# entity-framework iqueryable


    【解决方案1】:

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

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

    【讨论】:

    • 您最好也谈谈返回 IQueryable 的危险。您真的不想将生成什么查询的控制权交给其他层。尤其是如果您要使用 OData 公开它。
    【解决方案2】:

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

    IQueryables 仅在调用“终端”方法时进行评估,例如,ToList()ToArray()Single()SingleOrDefault()First()FirstOrDefault()Count()Any() 等。这是提供者快速介入并进行翻译的时候。 Microsoft 包含一个 LINQ 提供程序,它不会对任何内容进行转换,而是在内存中运行。这是通过调用扩展方法AsQueryable()IEnumerable<T> 转换为IQueryable<T> 时使用的方法。

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2017-07-20
      • 2014-09-23
      • 2014-07-25
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多