2009-09-13 12 views

risposta

3

LINQ è un linguaggio di query, in modo da non fare gli aggiornamenti o inserti. Tuttavia -il LINQ to SQL modello oggetto entità ha metodi per la gestione CUD:

using(MyDataContext dc = new MyDataContext()) 
{ 
    //select the source entities from Table2 
    var Table2Entities = (from e in dc.Table2 where e.Field1 == "value" select e); 

    //for each result, create a new Table1 entity and attach to Table1 
    Table2Entities.ForEach(t2e => dc.Table1.InsertOnSubmit(
     new Table1Entity { 
      Field1 = t2e.Field1, 
      Field2 = t2e.Field2, 
      Field3 = t2e.Field3 
     }); 

    //submit the changes 
    dc.SubmitChanges(); 
} 

La vera differenza qui è che richiede due transactionsinstead SQL separata di una - una a selezionare, e uno da inserire.

+0

Avete qualche documento? per sostenere l'affermazione che tutti gli inserimenti avvengono in un round trip? –

+0

@Adam nope. Solo la mia memoria, che è spesso difettosa. Toglierò quel po 'finché non sarà chiarito in un modo o nell'altro. Grazie! –

+0

@Adam, lo strumento SQL Profiler farà luce su come LINQ-to-SQL sta comunicando con il server del database ed è un buon modo per misurare le prestazioni e quanto bene LINQ sta costruendo le sue query e i suoi batch. –

5

Poiché non si restituisce alcun risultato, basta utilizzare il metodo di basso livello DataContext.ExecuteCommand():

using (MyDataContext dc = new MyDataContext()) 
{ 
    dc.ExecuteCommand(@" 
     INSERT INTO Table1 (field1, field2, field3) 
     SELECT field1, field2, field3 
     FROM Table2 
     WHERE (field1= {0}) 
     ", 
     field1); 
} 
0

Se il campo di entrambe le tabelle è lo stesso, allora, uso

insert into table1 select * from table2 where table2.field1='xyz';

al posto di:

INSERT INTO Table1 (field1, field2, field3) 
SELECT field1, field2, field3 
FROM Table2 
WHERE (field1= @field1) 
Problemi correlati