代码之家  ›  专栏  ›  技术社区  ›  Vishal

我应该总是返回IQueryable<>而不是IList<>?

  •  1
  • Vishal  · 技术社区  · 14 年前

    我碰到这个 post 当我在寻找提高性能的方法时。目前,在我的申请中,我们将返回 IList<> 到处都是。把这些收益都改成 AsQueryable() ?

    这是我发现的-

    • 可查询() -上下文必须是 打开,你无法控制 数据库上下文的生存期 需要妥善处理。阿尔索 它是延迟执行(更快 过滤(与列表相比)
    • IList<> -最好是这样 结束 List<> 因为它提供了一个赤骨 以及轻量级实现。

    什么时候应该优先考虑?我知道基本知识,但很抱歉,我仍然不清楚何时以及如何在应用程序中正确使用它们。如果下次我能在还东西之前记住这一点,那就太好了。非常感谢。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Vlad    14 年前

    基本上,你应该尽量参考你需要的最宽的字体。例如,如果某个变量声明为 List<...> ,则为可分配给它的值的类型设置约束。可能只需要顺序访问,因此将变量声明为 IEnumerable<...> 相反。这将允许您将其他类型的值分配给变量,以及LINQ操作的结果。

    如果您发现您的变量需要通过索引访问,则可以再次将其声明为 IList<...> 不仅仅是 列表<…> ,允许其他类型实现 IList<…> 分配给它。

    对于函数返回类型,这取决于您。如果您认为函数返回 列表<…> ,您声明它将完全返回 列表<…> 。如果唯一重要的事情是通过索引访问结果,那么也许您不需要约束自己精确地返回 列表<…> ,您可以将返回类型声明为 IList<…> (但实际上返回 列表<…> 在这个实现中,可能还有其他类型的支持 IList<…> 稍后)。同样,如果您看到关于函数返回值的唯一重要的事情是它可以被枚举(并且不需要通过索引进行访问),那么您应该将函数返回类型更改为 IEnumerable<…> 给自己更多的自由。

    现在,大约 AsQueriable ,这又取决于你的逻辑。如果您认为可能的延迟计算在您的情况下是一件好事,因为它可能有助于避免不必要的计算,或者您打算将其用作其他查询的一部分,则使用它。如果您认为结果必须“具体化”,即此时计算,则最好返回 列表<…> . 如果以后的计算可能会导致不同的列表,那么您尤其需要实现您的结果!

    对于数据库,一个好的经验法则是 可询问的 对于短期的中间结果,但是 List 对于“最终”结果,将在较长时间内使用。当然,有一个非具体化的查询挂起会使关闭数据库变得不可能(因为在实际评估数据库时应该仍然是打开的)。

        2
  •  0
  •   Ali Tarhini    14 年前

    如果您不打算在sql server上执行任何进一步的查询,那么您应该返回IList,因为它会生成内存中的数据

        3
  •  0
  •   AntonioR    14 年前

    如果您关心性能,那么还应该尝试在尽可能少的DB请求上运行查询,并缓存最常用的查询。使用批处理方法显著缩短请求处理时间是非常常见的。

    您使用哪个ORM从数据库检索数据?如果你使用NHibernate,请看这篇关于如何使用 Future , Multi Criteria 1 , Multi Criteria 2 Multi Query .

    问候语。