LINQ to zapytanie technologia, ale myślę, że wiemy, co masz na myśli; możesz chcieć być nieco bardziej szczegółowy, niezależnie od tego, czy jest to LINQ-to-SQL, czy Entity Framework. Możesz również wyjaśnić, co oznacza "zbiorcze" w twoim przypadku... dla 10-100 rekordów możesz użyć innej odpowiedzi na 10 000 rekordów (gdzie SqlBulkCopy
do tabeli pomostowej i procedura składowana do zaimportowania do bazy danych byłaby najlepszym pomysłem).
W przypadku stosunkowo małej liczby — po prostu użyj narzędzia ORM, aby znaleźć rekordy — na przykład za pomocą LINQ-to-SQL (być może z transakcją obejmującą serializowalną) — i użyj C# do ilustracji (zaktualizowane, aby pokazać pętlę i pamięć podręczną ):
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();
Właściwie, ze względu na wydajność zastanawiam się, czy może to być jedna z tych sytuacji, w których klucz naturalny ma sens - np. użyj Tag
(varchar
) jako klucz podstawowy i zduplikuj go (jako klucz obcy) w VideoTags
- wtedy nie musisz dołączać do Tags
stół cały czas.
Jeśli liczby są większe, całkiem łatwo jest użyć SqlBulkCopy
; po prostu umieść dane w DataTable
i popchnij go, a następnie wykonaj pracę w TSQL.