我有一个标签表。如何使用LINQ批量插入?

时间:2009-06-28 07:47:47

标签: vb.net linq sql-server-2005

我正在使用VB.NET和LINQ到MS SQL。 我有两张桌子。现在我想使用LINQ在Tags表中插入多个项目,但是也想检查Tags表中是否存在任何标记。它不会再插入它并在两种情况下都带有TagID(如果已插入或存在)

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

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

使用LINQ实现此目的的最佳方法是什么?

提前致谢

1 个答案:

答案 0 :(得分:4)

LINQ是查询技术,但我想我们知道你的意思;您可能想要更具体一点,无论这是LINQ-to-SQL还是Entity Framework。您可能还想澄清在您的情况下“批量”的含义...对于10-100条记录,您可以对10,000条记录使用不同的答案(其中SqlBulkCopy到临时表和要导入的存储过程db是最好的主意。)

对于相对较低的数字 - 只需使用您的ORM工具查找记录 - 例如使用LINQ-to-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();

实际上,出于性能原因,我想知道这是否可能是自然键有意义的场合之一 - 即使用Tagvarchar)作为主键,并复制它(作为VideoTags中的外键) - 那么您不需要一直加入Tags表。


如果数字较大,则使用SqlBulkCopy非常简单;只需将数据放入DataTable并将其翻转,然后在TSQL中完成工作。