我有一个使用C#和LINQ-to-SQL(SQL Server 2008 R2)在MVC.Net中编写的Web应用程序。
我想查询数据库中的某些值,并将这些值插入另一个表中供以后使用。显然,我可以进行正常选择,然后获取这些结果并进行正常插入,但这会导致我的应用程序将值发送回SQL服务器,这是一个浪费,因为服务器是值来自的地方。 / p>
有什么方法可以在我的应用程序中获取选择结果并将它们插入到另一个表中,而没有信息从SQL服务器往我的应用程序再次返回?
如果这是一次查询会很酷,但这比避免往返更重要。
假设您喜欢任何基本架构,我会将您的简单示例推断为更复杂的查询。
答案 0 :(得分:2)
我可以在没有往返的情况下将Select语句的结果插入到另一个表中吗?
来自"单一查询"和/或"避免往返"观点:是的。
从纯粹的Linq到SQL"观点:嗯...大多数情况; - )。
所需的三件是:
INSERT...SELECT
构造:
通过使用这个,我们获得了目标的一半,因为我们选择了数据并将其插入。这是将数据完全保留在数据库服务器上并避免往返的唯一方法。遗憾的是,Linq-to-SQL(或实体框架)不支持此构造:Insert/Select with Linq-To-SQL
T-SQL OUTPUT子句:
这允许在Unix shell脚本中执行本质上是tee
的命令:save 和同时显示传入的行 。 OUTPUT
子句只接受插入的行集并将其发送回调用者,提供目标的另一半。不幸的是,Linq-to-SQL(或实体框架)也不支持这一点。现在,这种类型的操作也可以在不使用OUTPUT
的情况下跨多个查询实现,但实际上没有任何好处,因为您需要a)创建临时表以将初始结果转储到将被使用的插入到表中然后选择回调用者,或者b)知道哪些行刚刚插入表中是新的,以便可以正确地选择它们回调用者。
DataContext.ExecuteQuery<TResult> (String, Object[])方法:
由于Linq-to-SQL中不直接支持两个必需的T-SQL部分,因此需要这样做。即使完成避免OUTPUT
子句的笨重方法(假设它可以在纯Linq / Lambda表达式中完成),仍然没有办法围绕INSERT...SELECT
构造不会是圆的-trip。
因此,多个纯Linq / Lambda表达式的查询都等同于往返。
真正避免往返的唯一方法应该是:
var _MyStuff = db.ExecuteQuery<Stuffs>(@"
INSERT INTO dbo.Table1 (Col1, Col2, Col2)
OUTPUT INSERTED.*
SELECT Col1, Col2, Col3
FROM dbo.Table2 t2
WHERE t2.Col4 = {0};",
_SomeID);
以防万一它可以帮助任何人(因为我已经花了一些时间查找:),实体框架的等效命令是:Database.SqlQuery<TElement> (String, Object[])
答案 1 :(得分:0)
根据您的要求尝试此查询
insert into IndentProcessDetails (DemandId,DemandMasterId,DemandQty) ( select DemandId,DemandMasterId,DemandQty from DemandDetails)