Как обойти тот факт, что Linq to SQL использует отдельные операторы SQL DELETE для каждого элемента в DeleteAllOnSubmit - PullRequest
3 голосов
/ 04 ноября 2011

При использовании оператора DeleteAllOnSubmit, подобного следующему (я опускаю DataContext, потому что здесь я использую LinqPad)

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 или что-то подобное?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Почему не хранимый процесс с табличной переменной в качестве входной переменной? Вы можете вызвать сохраненные процедуры из LINQ.

Я не вижу причин не использовать SQl для работы, для которой он предназначен, если ORM создает плохо работающий SQL.

2 голосов
/ 04 ноября 2011

Пользовательский генератор запросов с методом расширения должен позволять выполнять пакетное удаление:

http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx

Однако я не уверен, поддерживает ли он оператор Take.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...