2009-06-28 2 views
1

VB.NET을 LINQ에서 MS SQL로 사용하고 있습니다. 다음 두 개의 테이블이 있습니다. 이제 LINQ를 사용하여 태그 테이블에 여러 항목을 삽입하려고하지만 태그 테이블에 태그가 있는지 여부도 확인하려고합니다. 그것은나는 Tags Table을 가지고있다. LINQ를 사용하여 대량 삽입하는 방법?

CREATE TABLE Tags 
    (TagID bigint not null , 
    Tag varchar(100) NULL) 

CREATE TABLE VideoTags 
    (VideoID bigint not null , 
    TagID bigint not null) 

이 사용 LINQ를 acheive하는 가장 좋은 방법은 무엇입니까 다시 삽입하고 두 경우 모두에서 TagID를 가져올 (삽입 한 경우 또는 발견하는 경우가 존재)하지 않는 이유는 무엇입니까? 사전에

감사

답변

4

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에서 작업하십시오.

+0

LINQ-TO-SQL을 사용하고 있으며 한 번에 10-20 개의 레코드를 삽입하려고합니다. 위의 쿼리는 한 번에 하나의 값을 삽입합니다. 한 번에 10-20 값을 모두 삽입하고 TagID를 검색 할 수 있습니까? –

+1

필요한만큼 많은 InsertOnSubmit을 사용할 수 있습니다. TagID는'SubmitChanges'를 호출 할 때까지 사용할 수 없지만 실제로 필요하지는 않습니다 -'VideoTag' 객체에 적절한'tag' 객체를 줄 수 있어야합니다. 물론 자연스러운 키를 사용하면 이는 별다른 문제가 아닙니다. –

+1

또한 로컬 사전 에 알려진 태그를 캐싱 할 수 있습니다. 그렇지 않으면 불필요한 SQL 쿼리를 수행 할 수 있습니다. 내가 업데이트 할게 ... –

관련 문제