LINQ はクエリです テクノロジーですが、あなたの言いたいことはわかっていると思います。これが LINQ-to-SQL であるか Entity Framework であるかをもう少し具体的にしたい場合があります。また、あなたのケースで「バルク」が何を意味するのかを明確にすることもできます... 10 ~ 100 レコードの場合、10,000 レコードに対して別の回答を使用する可能性があります (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();
実際、パフォーマンス上の理由から、これは自然キーが意味をなす場合の 1 つではないかと思います。つまり、 Tag
を使用します。 (varchar
) を主キーとして、それを (外部キーとして) VideoTags
に複製します。 - Tags
に参加する必要はありません
数値が大きい場合は、 SqlBulkCopy
を使用するのが非常に簡単です;データを DataTable
に入れるだけです プッシュしてから、TSQL で作業を行います。