2009-06-28 67 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