1

我在寻找提高性能的东西时遇到了这篇文章。目前,在我的申请中,我们正在IList<>各地返回。将所有这些回报更改为 是个好主意AsQueryable()吗?

这是我发现的 -

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

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

4

3 回答 3

2

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

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

对于函数返回类型,这取决于您。如果您认为该函数准确返回很重要,则将其List<...>声明为准确返回List<...>。如果唯一重要的是通过索引访问结果,也许您不需要约束自己返回完全List<...>,您可以将返回类型声明为IList<...>(但实际上返回List<...>此实现中的一个实例,并且可能是其他支持的类型IList<...>之后)。同样,如果您看到函数的返回值唯一重要的是它可以被枚举(并且不需要通过索引访问),您应该将函数返回类型更改为IEnumerable<...>,给自己更多的自由。

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

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

于 2010-11-23T22:53:41.917 回答
0

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

您使用哪个 ORM 从数据库中检索数据?如果您使用 NHibernate,请参阅这篇关于如何使用FutureMulti Criteria 1Multi Criteria 2Multi Query的帖子。

问候。

于 2010-11-23T23:51:10.567 回答
0

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

于 2010-11-23T22:46:27.077 回答