LINQ는 쿼리 기술입니다,하지만 우리는 당신이 무슨 뜻인지 알 것 같아요; 이것이 LINQ-to-SQL 이건 Entity Framework 이건간에 좀 더 구체적 일 수 있습니다. 귀하의 경우 "대량"의 의미를 명확히하고 싶을 수도 있습니다 ... 10-100 개의 레코드에 대해 10,000 개의 레코드에 대해 다른 대답을 사용할 수 있습니다 (db에서 가져올 스테이징 테이블과 저장 프로 시저에 대한 SqlBulkCopy
은 최선의 아이디어).
ORM 도구를 사용하여 레코드를 찾으십시오 (예 : LINQ-to-SQL (예 : 일련의 직렬 트랜잭션 가능)) - 그림을 보려면 C#을 사용하십시오 (은 루프 및 캐시 표시로 업데이트 됨)가) - (같은 즉, 기본 키로 Tag
합니다 (varchar
)를 사용하고, 중복
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();
사실, 성능상의 이유로 나는이 자연 키 말이 그 경우 중 하나가 될 수 있는지 궁금 외래 키)를 VideoTags
에 입력하면 항상 Tags
테이블에 가입 할 필요가 없습니다. 숫자가 큰 경우
, SqlBulkCopy
를 사용하기 매우 쉬운; DataTable
에 데이터를 입력하고 밀어 넣은 다음 TSQL에서 작업하십시오.
LINQ-TO-SQL을 사용하고 있으며 한 번에 10-20 개의 레코드를 삽입하려고합니다. 위의 쿼리는 한 번에 하나의 값을 삽입합니다. 한 번에 10-20 값을 모두 삽입하고 TagID를 검색 할 수 있습니까? –
필요한만큼 많은 InsertOnSubmit을 사용할 수 있습니다. TagID는'SubmitChanges'를 호출 할 때까지 사용할 수 없지만 실제로 필요하지는 않습니다 -'VideoTag' 객체에 적절한'tag' 객체를 줄 수 있어야합니다. 물론 자연스러운 키를 사용하면 이는 별다른 문제가 아닙니다. –
또한 로컬 사전에 알려진 태그를 캐싱 할 수 있습니다. 그렇지 않으면 불필요한 SQL 쿼리를 수행 할 수 있습니다. 내가 업데이트 할게 ... –