【问题标题】:What Return Type? For "Getter" Functions Containing LINQ-to-SQL Which Return Many Rows什么返回类型?对于包含返回多行的 LINQ-to-SQL 的“Getter”函数
【发布时间】:2012-06-28 09:46:27
【问题描述】:

我正在开发一个 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) 纯粹是因为可读性,如果我调用.Count.First 并执行For Each,IQueryable(我认为,但可能是错误的)会多次访问数据库?而且数据库交互是昂贵的,不是吗?

鉴于以下情况:

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

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

非常感谢。

【问题讨论】:

    标签: sql-server vb.net linq sql-server-2008 linq-to-sql


    【解决方案1】:

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

    如果您将其作为 IEnumerable(列表、数组.. 等)返回。返回函数调用后,对象将被加载到内存中。

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

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2010-12-01
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2015-01-18
      • 1970-01-01
      相关资源
      最近更新 更多