2012-12-07 49 views
1

我有以下情况:我需要创建一些临时表来优化最近发生的加载问题。看起来,LINQ to SQL对临时表不能很好地工作,除非它们映射到DBML上。老实说,我仍然不明白在LINQ to SQL中作用域是如何工作的。考虑到这一点,我去定义DBML上的每个临时表。使用动态临时表

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

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

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

简历: 所以,你知道或者是它甚至有可能创建动态的临时表是LINQ to SQL中可以工作?我无法在编译时间上定义它的名称,只能在执行时定义它。任何提示将不胜感激。

+0

Linq to Sql不是一个全面的解决方案。像任何其他ORM一样,它涵盖了您可能想要对数据库执行的操作的80%。剩下的20%更适合其他技术。 –

+0

@Robert所以,你会建议我使用普通的旧ADO.Net来做到这一点吗?除了它以外,我无法考虑任何其他解决方案。 – AdrianoRR

回答

1

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

要么手动打开连接(当然要关闭它),要么将所有内容都包裹在与L2S集成的TransactionScope中,并保持连接处于打开状态。

+0

您确定 - 每个提交更改已包装在单个事务中,并且通常每个逻辑请求只需一个SubmitChanges。 – Pleun

+0

我确定,是的,但我不确定你的意思。你的意思是说你的所有提交都被包裹在一个交易中,或者每个提交都被包裹在一个新的交易中?后一种情况会浪费你的临时表。 “逻辑请求”令人困惑。我的意思是查询或提交。 – usr

+0

当您调用SubmitChanges时,LINQ to SQL将检查该调用是否在事务的范围内,或者如果事务属性(IDbTransaction)设置为用户启动的本地事务。如果它找不到事务,则LINQ to SQL启动一个本地事务(IDbTransaction)并使用它来执行生成的SQL命令。 http://stackoverflow.com/q/542525/532498 – Pleun

0

以优化负载问题

LINQ的-2-SQL和批次/大部分将无论如何不一起工作。每个插入/更新/删除都会导致一个语句(好的,一个事务但仍然)。对于核心性能,避免Linq-2-sql,一旦你有你的数据,使用Linq具有所有优势,如强打字等。

+0

不幸的是,我不是谁与数据库工作。我有几种解决方法来处理未规范化的数据库。最大的问题是负载问题不是'每个人'。但我明白你的建议,不要在这种情况下使用linq-to-sql。然而,由于这是我默认的ORM,我只是想知道它有可能。 – AdrianoRR

+0

您是否签出SqlBulkCopy - 速度非常快,并且难以实现 – Pleun