2009-09-13 9 views

Odpowiedz

3

LINQ to język zapytań, więc nie zrobić aktualizacje lub wkładki. Jednak -the LINQ to SQL model obiektowy jednostka ma metody obchodzenia 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(); 
} 

Prawdziwa różnica jest to, że wymaga to dwa oddzielne transactionsinstead SQL One - jeden do wyboru, a jeden do wstawienia.

+0

Czy masz jakiś dokument Aby utworzyć kopię zapasową twierdzenie, że wszystkie wstawki mają miejsce w jednej rundzie podróży? –

+0

@Adam nope. Tylko moja pamięć, która często jest wadliwa. Usuwam ten bit ", dopóki nie zostanie wyjaśniony w ten czy inny sposób. Dzięki! –

+0

@Adam, narzędzie SQL Profiler rzuci trochę światła na sposób komunikacji LINQ-SQL z serwerem bazy danych i jest dobrym sposobem mierzenia wydajności oraz tego, jak dobrze LINQ konstruuje swoje zapytania i partie. –

5

Ponieważ nie wracają żadnych wyników, wystarczy użyć metody niskiego poziomu 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

Jeśli pole obu tabelach są takie same wtedy, użycie

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

w miejsce:

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