2011-11-04 45 views
3

当使用像下面这样的DeleteAllOnSubmit声明(我省略DataContext的,因为我使用LinqPad这里)如何解决的事实,LINQ到SQL是使用单独的SQL DELETE每个项目报表DeleteAllOnSubmit

var deleteUs = Foo.Take(9658); 
Foo.DeleteAllOnSubmit(deleteUs); 
SubmitChanges(); 

生成的SQL代码如下所示:

SELECT TOP (9658) [t0].[id] FROM [Foo] AS [t0] 
GO 

-- Region Parameters 
DECLARE @p0 Int SET @p0 = 1 
-- EndRegion 
DELETE FROM [Foo] WHERE [id] = @p0 
GO 

-- Region Parameters 
DECLARE @p0 Int SET @p0 = 2 
-- EndRegion 
DELETE FROM [Foo] WHERE [id] = @p0 
GO 
... and so on 

2号线在C#代码不能知道,1号线转换为一个SELECT TOP语句,它会更快使用DELETE TOP声明。

问题:我如何解决这个问题而不诉诸于SQL?有没有办法让Linq语句翻译成DELETE TOP或类似的东西?

+1

为什么你想在这里避免SQL?看起来像完美的解决方案。 –

+0

非物质的,但你的第一行可能是简单的'Foo.Take(9658)' – Marc

+1

@Andrew Barber:首先,这是一个风格问题,不要将SQL字符串混合到代码中,其次你必须使用第二个数据访问方法,第三,我真的很想知道这是否已经被微软团队所覆盖,因为他们声称框架产生了相当优化的SQL代码(我相信它通常是这样做的。) – Olaf

回答

2

为什么不使用表变量作为输入变量的存储过程?你可以从LINQ调用存储过程。

如果ORM创建执行不力的SQL,我看不到任何理由不使用SQl作为它打算执行的任务。

+0

Andrew Barber已经建议在评论中使用SP。这绝对是一种方式,但我的问题至少部分是学术性的 - 我只想知道是否有另一种方式(因为我认为这是一个普遍的任务),或者明白为什么没有。 – Olaf