我正在使用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实现此目的的最佳方法是什么?
提前致谢
答案 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();
实际上,出于性能原因,我想知道这是否可能是自然键有意义的场合之一 - 即使用Tag
(varchar
)作为主键,并复制它(作为VideoTags
中的外键) - 那么您不需要一直加入Tags
表。
如果数字较大,则使用SqlBulkCopy
非常简单;只需将数据放入DataTable
并将其翻转,然后在TSQL中完成工作。