【问题标题】:Using dynamic temporary table使用动态临时表
【发布时间】:2012-12-08 05:36:15
【问题描述】:

我有以下情况:我需要创建一些临时表来优化最近发生的负载问题。 LINQ to SQL 似乎不适用于临时表,除非它们映射到 DBML。老实说,我仍然不明白范围如何在 LINQ to SQL 上工作。考虑到这一点,我在 DBML 上定义了每个临时表。

但是,和往常一样,事情不可能那么容易。我无法在编译时间(这是 linq 需要的)定义我的临时表将具有什么名称,因为它将在用户登录系统时定义。补充一点:我会有几个这样的动态临时表,所以我无法将它们全部映射到 DBML。

当我尝试通过executeCommand 创建临时表时,选择其结果并将其转换为强类型 (TempTableDefinition)。但是,当我尝试在这个新创建的临时表上插入值时,我得到一个 SQLException 说“无效的对象名称 #NewTempTable”(这是我用来创建表的同名)。

看来我将不得不使用纯旧的普通 ADO.NET 来创建每个临时表并将其属性映射到强类型对象(我更喜欢这种方法)。我真的不想将 ADO.NET 与 LINQ 混合使用,因为我刚刚读到这是一个坏主意。另外,与 ADO.NET 方式相比,我更喜欢强类型对象的 linq 方法。

简历: 那么,您知道或者甚至可以创建 linq to sql 可以使用的动态临时表吗?我无法在编译时定义它的名称,只能在执行时定义。任何提示将不胜感激。

【问题讨论】:

  • Linq to Sql 不是一个全面的解决方案。与任何其他 ORM 一样,它涵盖了您可能想要对数据库执行的大约 80% 的操作。剩下的 20% 更适合其他技术。
  • @Robert 所以,你会建议我使用普通的旧 ADO.Net 来做吗?除了它,我想不出任何其他解决方案。

标签: c# linq-to-sql temp-tables


【解决方案1】:

问题似乎是 L2S 默认打开和关闭每个逻辑请求的连接。这会杀死你的临时表。

要么手动打开连接(当然也可以关闭它),或者将所有内容包装在与 L2S 集成并保持连接打开的 TransactionScope 中。

【讨论】:

  • 您确定吗 - 每个 submitchanges 都已包含在一个事务中,通常每个逻辑请求只需要一个 SubmitChanges。
  • 我确定,是的,但我不确定你的意思。您的意思是您的所有提交都包含在事务中还是每个提交都包含在新的事务中?后一种情况会浪费您的临时表。 “逻辑请求”令人困惑。我的意思是查询或提交。
  • 调用 SubmitChanges 时,LINQ to SQL 会检查调用是否在事务范围内,或者事务属性 (IDbTransaction) 是否设置为用户启动的本地事务。如果未找到任何事务,LINQ to SQL 将启动一个本地事务 (IDbTransaction) 并使用它来执行生成的 SQL 命令。 stackoverflow.com/q/542525/532498
  • @Pleun,我同意这是真的。我的观点是,如果不存在用户事务,LINQ 会关闭连接。这会破坏临时表。如果存在用户 tran(通过 Transaction.Current 检测到),则连接保持打开状态。
  • @usr 但是,一旦我关闭了这个事务,我以后还能检索我的临时表吗?我需要这个临时表在创建后可用于某些插入。但我想它会消失的,对吧?
【解决方案2】:

优化负载​​问题

Linq-2-sql 和 batch/bulk 无论如何都不能一起工作。每个插入/更新/删除都会产生一个语句(好的,一个事务,但仍然)。对于核心性能,请避免使用 Linq-2-sql,一旦您将数据放入,请使用具有强类型等所有优势的 Linq。

【讨论】:

  • 不幸的是,我不是在使用数据库。我有几种解决方法可以使用未规范化的数据库。负载问题并不是“每 si”最大的问题。但我理解您在这种情况下不使用 linq-to-sql 的建议。但是,由于它是我的默认 ORM,我只是想知道它是否有可能。
  • 你检查过 SqlBulkCopy - 它非常快而且实现起来并不难
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多