LINQ - это технология query , но я думаю, что мы знаем, что вы имеете в виду; Возможно, вы захотите быть более конкретным, будь то LINQ-to-SQL или Entity Framework. Вы также можете уточнить, что означает «объемная» в вашем случае ... для 10-100 записей вы можете использовать другой ответ для 10000 записей (где 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();
На самом деле, из соображений производительности мне интересно, может ли это быть одним из тех случаев, когда имеет смысл использовать естественный ключ - то есть использовать Tag
(varchar
) в качестве первичного ключа и дублировать его (в качестве внешнего ключа) ) в VideoTags
- тогда вам не нужно все время присоединяться к таблице Tags
.
Если числа больше, использовать довольно просто SqlBulkCopy
; просто поместите данные в DataTable
и переместите их, затем выполните работу в TSQL.