LINQ är en fråga teknik, men jag tror att vi vet vad du menar; du kanske vill vara lite mer specifik om detta är LINQ-till-SQL eller Entity Framework. Du kanske också vill förtydliga vad "bulk" betyder i ditt fall... för 10-100 poster kan du använda ett annat svar än 10 000 poster (där SqlBulkCopy
in i en mellanställningstabell och en lagrad procedur för att importera vid db skulle vara den bästa idén).
För ett relativt lågt antal - använd bara ditt ORM-verktyg för att hitta posterna - till exempel med LINQ-till-SQL (kanske med en spännande serialiserbar transaktion) - och använd C# som illustration (uppdaterat för att visa loop och cache stark> ):
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();
Av prestationsskäl undrar jag faktiskt om detta kan vara ett av de tillfällen där en naturlig nyckel är vettig - dvs använd Tag
(varchar
) som primärnyckel, och duplicera den (som en främmande nyckel) i VideoTags
- då behöver du inte gå med i Tags
bord hela tiden.
Om siffrorna är större är det ganska enkelt att använda SqlBulkCopy
; lägg bara in data i en DataTable
och tryck över det, gör sedan arbetet i TSQL.