2009-09-13 63 views

Trả lời

3

LINQ là một ngôn ngữ truy vấn, vì vậy nó không làm cập nhật hoặc chèn. Tuy nhiên, mô hình đối tượng thực thể LINQ to SQL có các phương thức để xử lý 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(); 
} 

Sự khác biệt thực sự ở đây là yêu cầu hai giao dịch SQL riêng biệt để chọn một và một để chèn.

+0

Bạn có tài liệu nào không ation để sao lưu khẳng định rằng tất cả các insertions diễn ra trong một chuyến đi vòng? –

+0

@Adam nope. Chỉ là trí nhớ của tôi, thường bị lỗi. Tôi sẽ loại bỏ bit đó 'cho đến khi nó bị xóa một cách này hay cách khác. Cảm ơn! –

+0

@Adam, công cụ SQL Profiler sẽ làm sáng tỏ cách LINQ-to-SQL giao tiếp với máy chủ cơ sở dữ liệu và là cách tốt để đo lường hiệu suất và LINQ đang xây dựng các truy vấn và lô của nó tốt như thế nào. –

5

Vì bạn đang không trả lại bất kỳ kết quả, chỉ cần sử dụng các phương pháp ở mức độ thấp 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

Nếu trường của cả hai bảng là cùng lúc đó, sử dụng

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

thay cho:

INSERT INTO Table1 (field1, field2, field3) 
SELECT field1, field2, field3 
FROM Table2 
WHERE (field1= @field1) 
Các vấn đề liên quan