2010-05-21 4 views
1

나는 다음과 같은 LINQ 쿼리를 가지고 말 :Linq는 쿼리 도움말이 필요

var source = from workflow in sourceWorkflowList 
      select new { SubID = workflow.SubID, 
          ReadTime = workflow.ReadTime, 
          ProcessID = workflow.ProcessID, 
          LineID = workflow.LineID }; 

var target = from workflow in targetWorkflowList 
      select new { SubID = workflow.SubID, 
          ReadTime = workflow.ReadTime, 
          ProcessID = workflow.ProcessID, 
          LineID = workflow.LineID }; 

var difference = source.Except(target); 

sourceWorkflowListtargetWorkflowList가 동일한 열 정의가 있습니다. 그러나 둘 다 위의 쿼리에 표시된 것보다 많은 데이터 열을 포함합니다. 이것들은이 특별한 이슈에 필요한 컬럼 일뿐입니다.

difference 지금 targetWorkflowList

에 포함 된 내가 뭘하고 싶은 것은 difference에 존재하지 않는 sourceWorkflowList에서 모든 행을 제거하는 것입니다되지 않습니다 sourceWorkflowList의 모든 행이 포함되어 있습니다. 누군가 나에게이 일을하는 쿼리를 보여줄 수 있습니까? 매우

감사합니다 - 랜디

+0

이 쿼리의 고유 레코드 ID의 값 중 하나입니다? –

+0

@Matthew - 아니요.하지만 SubID + ReadTime + ProcessID + LineID는 모두 기본 데이터베이스 테이블에 고유 키를 구성합니다. –

답변

2

당신이 실제로 원하는 것은 소스와하지에 무엇이입니다 (대상에 어떤 소스에의하지) : S (S \ T) = S CUT T

var result = from sourceWorkflow in sourceWorkflowList 
      join targetWorflow in targetWorkflowList on 
       new {sourceWorkflow.SubID, sourceWorkflow.ReadTime, sourceWorkflow.ProcessID, sourceWorkflow.LineID} 
       equals 
       new {targetWorflow.SubID, targetWorflow.ReadTime, targetWorflow.ProcessID, targetWorflow.LineID} 
      select sourceWorkflow; 

그리고 다른 형태의 (그러나 이것은 단지 당신에게 줄 것이다 4 열) :

var result = sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID}) 
    .Intersect(sourceWorkflowList.Select(workflow => new {workflow.SubID, workflow.ReadTime, workflow.ProcessID, workflow.LineID})); 
+1

인터 섹트를 사용하는 것이 더 쉬울까요? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx –

+0

@Rob Fonseca-Ensor : 맞습니다. 나는 이것을 답에 추가했다. – brickner

+0

@Brickner - 가까운 거리에 있습니다. 예, 대상에없는 원본을 원하지만 원본 조회에 표시된 네 개의 열에서만 비교를 수행해야합니다. 비교에 사용하지 않으려는 표가 세 가지 추가 열입니다. –

1

당신이 List<T> 사용하는 가정 :

을 포맷에 대한
sourceWorkflowList.RemoveAll(
    workflow => difference.Contains(
        new { 
          SubID = workflow.SubID, 
          ReadTime = workflow.ReadTime, 
          ProcessID = workflow.ProcessID, 
          LineID = workflow.LineID 
         })); 

사과 ...

1

당신은 @ 롭 - 폰세카 - ENSOR에 의해 제안 당신은 단지 원래의 용기에 변화가 제거 작업을 수행하기 위해 필요한 제약,

하는 경우가있는 경우 차이점 목록은 HashSet()으로 변환하여 빠른 검색을 먼저 수행하는 것이 좋습니다. 그렇지 않으면

...

당신이 목록을 여러 번 반복 방지로이 @brickner가 제시 한 교차/가입 옵션을 사용 차이를 받고 방식을 변경 할 수 있습니다.

새 컬렉션이 허용하지만, 당신이 이미있는 경우 차이 (를 생성하는 코드 대체 할 수 없습니다) :

var changedSource = source.Except(difference);