2013-03-11 2 views
1

외부 소스에서 온 엔티티 목록이 있습니다. 나는 이미 가지고있는 것과 그것을 비교할 필요가 있으며, 존재하지 않는 것들만 추가해야합니다. 아래의 의사 코드.엔티티에 linq를 사용하여 엔티티 목록이 이미 데이터베이스에 있는지 확인하십시오.

var newVersions = item.Versions 
     .Where(s => db.ExistingVersions 
      .Select(t=>t.versionID) 
      .DoesNotContains(s.versionID)); 

분명히 작동하지 않으며 수정 방법을 잘 모르겠습니다. for 루프를 사용하고 싶지는 않습니다. 왜냐하면 각 항목의 버전을 확인하기 위해 수백 개의 데이터베이스 히트가있을 것이라고 생각하기 때문입니다. 여러 항목을로드하는 중이며 각 항목의 버전은 100 개입니다.

+0

다른 Where 절로 DoesNotContains를 다시 작성 하시겠습니까? 아니면 내가 당신의 질문을 오해하고 있습니까? – bas

+0

기존 결과를 제외하는 방법을 모르십니까? –

+0

아무도 대답을하지 않으면 몇 분 더 기다려야 겠어. 뭔가 시도해 볼게 :) – bas

답변

7

내가 생각하는 것보다 더 이상 의문이 없다면 그것은 복잡하지 않아야합니다. VersionID 고유 식별자이라고 가정

, 당신은이 작업을 수행 할 수 있습니다

var existingVersions = db.ExistingVersions.Select(x => x.VersionID).ToList(); 

마음을, 그것은 더 나은 것 Contains을 위해 :

var existingVersions = new HashSet(db.ExistingVersions.Select(x => x.VersionID).ToList()); 

[편집] : 당 매그너스의 위의 코드에서 ToList을 삭제할 수 있습니다.

한 다음 :

데이터베이스를 호출 할 때 이것은 아마도 가장 성능이 좋은, '원인
var newVersions = items.Versions.Where(x => !existingVersions.Contains(x.VersionID)); 

, 당신은 단지 VersionID을 선택합니다. 다른 옵션은 사용자 정의 IEqualityComparer<T>을 작성하고 Except을 사용하는 것이지만, DB에서 비용이 많이 드는 모든 것을 가져와야합니다.

+0

예, HashSet은 가야하지만, 불필요한'ToList'를 삭제해야합니다. (해시 세트가 쿼리를 구체화합니다.) – Magnus

+0

@Magnus 그 점을 지적 해 주셔서 감사합니다. 해당 정보를 포함하도록 답변을 편집했습니다. –

+0

@Magnus'HashSet'을 사용하는 것이 왜 더 나은가? –

1

당신은 같은 것을 시도 할 수 : 명심하기

// in memory: get list of potential version ids 
var potentialIds = item.Versions.Select(o => o.versionID).ToList(); 

// hit database (once) : get existing version ids 
var existingIds = db.ExistingVersions 
    .Where(o => potentialIds.Contains(o.versionID)) 
    .Select(o => o.versionID) 
    .ToList(); 

// in memory: filter potential objects 
var newVersions = item.Versions 
    .Where(o => !existingIds.Contains(o.versionID)) 
    .ToList(); 

// database inserts: 
foreach(var newVersion in newVersions) 
{ 
    ... 

한 가지입니다이 아니다 스레드 안전 : 뭔가 다른이 동시에 ExistingVersion 행을 추가하는 경우, 삽입하려고 할 수 있습니다 데이터베이스를 확인한 후에 추가 된 레코드.

관련 문제