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

时间:2010-11-23 22:42:30

标签: comparison asp.net-4.0 iqueryable ilist

我在寻找提高性能的方法时遇到了这个post。目前,在我的应用程序中,我们将返回IList<>到处。将所有这些回报更改为AsQueryable()是否是一个好主意?

这是我发现的 -

  • AsQueryable() - 需要上下文 打开你无法控制 数据库上下文的生命周期 它需要妥善处理。也 它是延迟执行('更快 过滤'与列表相比)
  • IList<> - 这应该是首选 超过List<>,因为它提供了一个准系统 和轻量级的实现。

还应该优先考虑另一个?我知道基础知识,但很抱歉,我仍然不清楚何时以及如何在应用程序中正确使用它们。很高兴知道这是下一次我会在返回任何东西之前记住这一点。非常感谢。

3 个答案:

答案 0 :(得分:2)

基本上,您应该尝试引用您需要的最广泛的类型。例如,如果某个变量声明为List<...>,则为可以分配给它的值的类型设置约束。您可能只需要顺序访问,因此将变量声明为IEnumerable<...>就足够了。这将允许您将其他类型的值分配给变量,以及LINQ操作的结果。

如果您发现您的变量需要按索引进行访问,则可以再次将其声明为IList<...>而不仅仅是List<...>,从而允许为其分配实现IList<...>的其他类型。

对于函数返回类型,它取决于您。如果您认为函数返回List<...>非常重要,则声明它准确返回List<...>。如果唯一重要的是通过索引访问结果,也许您不需要约束自己准确返回List<...>,您可以将返回类型声明为IList<...>(但实际上返回{的实例{1}}在此实现中,可能还有一些支持List<...>的其他类型。同样,如果您发现关于函数返回值的唯一重要的事情是它可以枚举(并且不需要通过索引进行访问),那么您应该将函数返回类型更改为IList<...>,给自己更自由。

现在,关于IEnumerable<...>,这又取决于你的逻辑。如果您认为可能的延迟评估在您的情况下是一件好事,因为它可能有助于避免不必要的计算,或者您打算将其用作另一个查询的一部分,您可以使用它。如果您认为结果必须“物化”,即在此刻计算,您最好返回AsQueriable。如果稍后计算可能导致不同的列表,您将特别需要实现结果!

对于数据库,一个好的经验法则是使用List<...>作为短期中间结果,但AsQueriable表示将在较长时间内使用的“最终”结果。当然,暂停非物化查询会导致无法关闭数据库(因为在实际评估数据库时应该仍然打开)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您担心性能问题,您还应尝试尽可能少的数据库请求运行查询并缓存最常用的查询。使用批处理方法显着减少请求处理时间是很常见的。

您使用哪个ORM从数据库中检索数据?如果您使用NHibernate,请参阅此帖子,了解如何使用FutureMulti Criteria 1Multi Criteria 2Multi Query

问候。