【问题标题】:I have a Tags Table. How to Bulk Insert using LINQ?我有一个标签表。如何使用 LINQ 批量插入?
【发布时间】:2009-06-28 07:47:46
【问题描述】:

我正在使用带有 LINQ to MS SQL 的 VB.NET。 我有两个下表。现在我想使用 LINQ 在标签表中插入多个项目,但还想检查标签表中是否存在任何标签。它不会再次插入它并在两种情况下都带上 TagID(如果插入或发现存在)

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

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

使用 LINQ 实现这一目标的最佳方法是什么?

提前致谢

【问题讨论】:

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


    【解决方案1】:

    LINQ 是一种查询 技术,但我想我们知道您的意思;您可能想要更具体一点,这是 LINQ-to-SQL 还是实体框架。您可能还想澄清“批量”在您的情况下的含义...对于 10-100 条记录,您可能会对 10,000 条记录使用不同的答案(其中 SqlBulkCopy 进入临时表和要在数据库中导入的存储过程将成为最好的主意)。

    对于一个相对较低的数字 - 只需使用您的 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 中完成工作。

    【讨论】:

    • 我正在使用 LINQ-TO-SQL,我想一次插入 10-20 条记录。上述查询一次插入一个值。我可以一次插入所有 10-20 个值并仍然检索 TagID
    • 您可以根据需要使用任意数量的InsertOnSubmit。 TagID 在您调用 SubmitChanges 之前将不可用,但您实际上并不需要它 - 您应该能够为 VideoTag 对象提供适当的 tag 对象。当然,使用自然键这不是问题。
    • 另外请注意,您可能希望在本地 Dictionary 中缓存已知标签 - 否则您可能会执行一些不必要的 SQL 查询。我会更新...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 2021-04-15
    • 2013-06-03
    • 1970-01-01
    • 2020-09-09
    相关资源
    最近更新 更多