LINQ е заявка технология, но мисля, че знаем какво имате предвид; може да искате да сте малко по-конкретни дали това е LINQ-to-SQL или Entity Framework. Може също да искате да изясните какво означава „групово“ във вашия случай... за 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.