LINQ là một truy vấn công nghệ, nhưng tôi nghĩ chúng tôi biết bạn muốn nói gì; bạn có thể muốn cụ thể hơn một chút cho dù đây là LINQ-to-SQL hay Entity Framework. Bạn cũng có thể muốn làm rõ "số lượng lớn" có nghĩa là gì trong trường hợp của mình ... đối với 10-100 bản ghi, bạn có thể sử dụng một câu trả lời khác cho 10.000 bản ghi (trong đó SqlBulkCopy
vào một bảng dàn và một thủ tục được lưu trữ để nhập tại db sẽ là ý tưởng tốt nhất).
Đối với một số lượng tương đối thấp - chỉ cần sử dụng công cụ ORM của bạn để tìm các bản ghi - ví dụ với LINQ-to-SQL (có thể với một giao dịch có thể tuần tự hóa kéo dài) - và sử dụng C # để minh họa ( được cập nhật để hiển thị vòng lặp và bộ nhớ cache ):
Dictionary<string,Tag> knownTags = new Dictionary<string,Tag>();
foreach(... your data ...) {
Tag tag;
if(!knownTags.TryGetValue(tagName, out tag)) {
tag = ctx.Tags.SingleOrDefault(t => t.Name == tagName);
if(tag == null) {
tag = new Tag { Name = tagName };
ctx.Tags.InsertOnSubmit(tag);
}
knownTags.Add(tagName, tag);
}
// insert video tag
}
ctx.SubmitChanges();
Trên thực tế, vì lý do hiệu suất, tôi tự hỏi liệu đây có thể là một trong những trường hợp mà khóa tự nhiên có ý nghĩa hay không - tức là sử dụng Tag
(varchar
) làm khóa chính và sao chép nó (làm khóa ngoại) trong VideoTags
- thì bạn không cần tham gia vào các thẻ Tags
bảng mọi lúc.
Nếu các số lớn hơn, khá dễ dàng để sử dụng SqlBulkCopy
; chỉ cần đặt dữ liệu vào một DataTable
và đẩy nó qua, sau đó thực hiện công việc trong TSQL.