0

我正在开发一个 ASP.NET (VB.NET) Web Forms 网站,该网站从 SQL Server 2008 R2 数据库中检索数据。

以前我会在代码隐藏文件中编写 LINQ-to-SQL 代码。但是,从现在开始,我希望将我所有的 LINQ-to-SQL 代码包含在“帮助器”类中的共享函数中

我知道如果我只返回一行,那么我的函数签名可以如下:

Public Shared Function GetMainBanner(pageId as Integer) As MainBanner

但是如果我返回零行或多行怎么办?以下哪一项是合适的/最便宜的:

Public Shared Function GetRelatedDls(pageId as Integer) As List(Of RelatedDl)

Public Shared Function GetRelatedDls(pageId as Integer) As IQueryable(Of RelatedDl)

Public Shared Function GetRelatedDls(pageId as Integer) As IEnumerable(Of RelatedDl)

'OR SOMETHING ELSE?

我最初的偏好List(Of RelatedDl)纯粹是因为可读性,并且 IQueryable (我认为,但可能是错误的)如果我调用.Count.First执行For Each? 而且数据库交互很昂贵,不是吗?

鉴于以下情况:

  • 我的大多数实体的属性都映射到nvarchar(50)orintbit
  • 我的两个实体有一个属性映射到nvarchar(MAX)
  • 我的“getter”函数一次将返回大约 5 - 25 行
  • 在处理 ASPX 页面请求时,将调用大约 10 - 20 个“getter”函数
  • 它运行在功能中等的 Windows 2008 服务器上的网站

哪个是最好的选择,或者是否有上面未列出的替代方案?

非常感谢。

4

1 回答 1

1

如果您将其作为 IQueryable 返回,则一旦从函数调用返回,您的数据库查询将不会执行,并且如果您的 DataContext 在函数中,您将遇到运行时错误,即与您的数据库的连接已关闭(一旦数据上下文超出范围)一旦您尝试使用查询结果。

如果您将其作为 IEnumerable (List、Array.. etc..) 返回。一旦你返回函数调用,对象就会被加载到内存中。

由您的设计决定哪种方法更好、更有效。如果您要从调用方法扩展查询(例如添加过滤器),IQueryable 会更好,因为扩展查询将在数据库级别执行,您将加载更少的数据。

于 2012-06-28T11:08:54.577 回答