我在寻找提高性能的方法时遇到了这个post。目前,在我的应用程序中,我们将返回IList<>
到处。将所有这些回报更改为AsQueryable()
是否是一个好主意?
这是我发现的 -
AsQueryable()
- 需要上下文
打开你无法控制
数据库上下文的生命周期
它需要妥善处理。也
它是延迟执行('更快
过滤'与列表相比)IList<>
- 这应该是首选
超过List<>
,因为它提供了一个准系统
和轻量级的实现。还应该优先考虑另一个?我知道基础知识,但很抱歉,我仍然不清楚何时以及如何在应用程序中正确使用它们。很高兴知道这是下一次我会在返回任何东西之前记住这一点。非常感谢。
答案 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,请参阅此帖子,了解如何使用Future,Multi Criteria 1,Multi Criteria 2和Multi Query。
问候。