2009-06-28 61 views
1

我使用VB.NET和LINQ to MS SQL。 我有兩個下面的表格。現在我想在使用LINQ的標籤表中插入多個項目,但也想檢查標籤表中是否存在任何標籤。它不會再重新插入,並把在這兩種情況下的標籤識別(如插入或如發現存在)我有一個標籤表。如何使用LINQ批量插入?

CREATE TABLE Tags 
    (TagID bigint not null , 
    Tag varchar(100) NULL) 

CREATE TABLE VideoTags 
    (VideoID bigint not null , 
    TagID bigint not null) 

什麼是達致這使用LINQ的最佳方式?

在此先感謝

回答

4

LINQ是查詢技術,但我認爲我們知道你的意思;您可能想要更具體一點,無論這是LINQ-to-SQL還是實體框架。您可能還想澄清在您的案例中「散裝」的含義......對於10-100條記錄,您可能對10,000條記錄使用了不同的答案(其中SqlBulkCopy放入臨時表和存儲過程以便在db處導入將是最好的主意)。

對於相對較低的號碼 - 只用你的ORM工具來查找記錄 - 例如使用LINQ到SQL(或許還有一個跨越序列化交易) - 和使用C#進行說明(更新,以顯示循環和高速緩存):

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(); 

實際上,由於性能原因,我不知道這是否會是那些場合自然鍵有意義的一個 - 即使用Tag(在varchar)作爲主鍵,並且複製(如一個外鍵)在VideoTags - 那麼你不需要一直加入Tags表。


如果數字是較大的,這是很容易使用SqlBulkCopy;只需將數據放入DataTable並推送,然後在TSQL中完成工作。

+0

我正在使用LINQ-TO-SQL,我想一次插入10-20條記錄。上面的查詢一次插入一個值。我可以一次插入所有10-20個值,但仍可以檢索TagID – 2009-06-28 08:02:40