я могу увидеть, что SQL / использует L2S для эффективного обновления нескольких записей? - PullRequest
3 голосов
/ 14 апреля 2011

Я просто сделал следующее:

var items =
    from c in Items
    where 
            c.Pid == Campaigns.Where(d=>d.Campaign_name=="US - Autos.com").First().Pid
        &&  c.Affid == Affiliates.Where(e=>e.Add_code=="CD4729").First().Affid
    select c;

Затем я хочу обновить поле для всех результатов:

items.ToList().ForEach(c=>c.Cost_per_unit=8);  
SubmitChanges();

При запросах я знаю, что могу использовать:

GetCommand(items);

Чтобы увидеть SQL, который будет выполнен.

Но при отправке изменений я не знаю, как это сделать.

Я смотрел:

GetChangeSet()

И я вижу, что в этом случае около 18 обновлений.

ВОПРОС 1: есть ли проблемы с эффективностью использования L2S для обновления таким способом?

ВОПРОС 2 (может быть, этодолжен быть отдельный вопрос, но я попробую его здесь): есть ли общий способ просто отслеживать операторы SQL, которые идут в SQL Server 2008 R2?Думаю, я мог бы отключить все, кроме TCP для экземпляра и WireShark порт (если материал даже читабелен), но я надеюсь, что есть более простой способ.

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

DataContext имеет свойство Log, к которому вы можете подключиться для выгрузки выполненного SQL. Существует также Linq To Sql Profiler , что просто потрясающе.

0 голосов
/ 14 апреля 2011

Относительно эффективности - Конечно, есть более эффективные способы выполнить обновление, поскольку оно существует в вашем вопросе; Например, такой SQL-запрос был бы гораздо более эффективным (не было бы выполненного запроса SELECT, кода, выполняемого для извлечения данных из SQL в набор объектов, кода, выполняемого для обновления объектов, кода, выполняемого для определить, какие объекты были изменены, код, выполненный для генерации соответствующих операторов SQL, и запросы UPDATE, выполненные на сервере SQL):

UPDATE Items SET Cost_per_unit = @CostPerUnit
FROM Items
    JOIN Campaigns ON ...
    JOIN Affiliates ON ...
WHERE ...

Но Linq to SQL не предоставляет никакого способа создания такого запроса. Если вы собираетесь обновлять тысячи строк очень простым способом, похожим на ваш вопрос, лучше вместо этого выполнить такой оператор SQL. Если обновленных строк не будет, или если логика более сложная, сохраните ее в Linq to SQL.

0 голосов
/ 14 апреля 2011

При запросе я знаю, что могу использовать:

GetCommand(items); Чтобы увидеть SQL, который будет выполнен.

Но при отправке изменений я не знаю, какчтобы сделать это.

Вы можете использовать это:

yourContext.Log = Console.Out;

Но я не уверен, регистрирует ли это весь SQL или просто select s.

Ваш SQL отличается для каждого затронутого объекта.L2S будет использовать зависимости, чтобы определить порядок, в котором объекты должны быть сохранены (если порядок важен), затем создаст операторы SQL insert, update и delete, чтобы сохранить изменения.Сгенерированные операторы (особенно для update) зависят от того, какие свойства объекта изменились.В частности, нет способа просмотреть весь пакет, который будет выполнен.

ВОПРОС 1: существуют ли проблемы с эффективностью использования L2S для обновления таким образом?

Нет,Вот как любой другой слой автоматического доступа к данным будет выполнять обновления.

ВОПРОС 2 (возможно, это должен быть отдельный вопрос, но я попробую его здесь): есть ли общий способ просто контролироватьОператоры SQL, которые идут в SQL Server 2008 R2?Я отключаю все, кроме TCP для экземпляра и WireShark порт, но я надеюсь, что есть более простой способ.

Это должен быть другой вопрос, но ответ заключается в использовании трассировки.В то время как вы можете отслеживать любую версию SQL Server (включая Express), инструмент SQL Server Profiler, который поставляется со всеми версиями, отличными от Express, делает это очень легко.Если вам нужна дополнительная информация по этому вопросу, не стесняйтесь задавать другой вопрос, касающийся ваших конкретных проблем.

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