많은 Google 검색 및 코드 실험을 거친 후 SQL에서 복잡한 C# LINQ-to-objects 문제를 겪었습니다. ROW_NUMBER() ... PARTITION BY 함수와 하위 쿼리 또는 두 개의 쌍으로 쉽게 해결할 수 있습니다.그룹 내 LINQ- 개체 인덱스 + 다른 그룹화 용 (별칭은 PARTITION BY와 동일한 ROW_NUMBER)
- 첫째, 그룹 목록을 (document.title이, 문서 기준 :
는 여기가 목록에서 중복 문서를 제거하고 기본 요구 사항을 code--에서 할 노력하고있어, 즉,이다. (단순화 된) 클래스 정의를 다음과 같이 가정합니다.
class Document { string Title; int SourceId; // sources are prioritized (ID=1 better than ID=2) }
- 해당 그룹 내에서 각 문서에 색인을 지정합니다 (예 : 색인 0 ==이 원본에서이 제목을 가진 첫 번째 문서, 색인 1 =이 문서와 함께 두 번째 문서). 이 소스의 제목 등). 나는 SQL에서 ROW_NUMBER()에 해당하는 것을 좋아할 것이다!
- 이제 색인은 2 단계에서 계산 된 (Document.Title, Index)에 의해 그룹화됩니다. 각 그룹에 대해 가장 낮은 Document.SourceId가있는 문서 하나만 반환하십시오.
1 단계 (예를 들어 codepronet.blogspot.com/2009/01/group-by-in-linq.html) 쉽게,하지만 난 단계 # 2, # 3에 난처한 상황에 빠진는군요. 3 단계 모두를 해결하기 위해 붉은 색 삐뚤어지지 않는 C# LINQ 쿼리를 만들 수 없습니다.
this thread에 대한 Anders Heilsberg의 게시물은 올바른 구문을 얻을 수 있다면 위의 2 단계와 3 단계에 대한 대답이라고 생각합니다.
나는 인덱스 계산을 수행하기 위해 외부 로컬 변수를 사용하지 않는 것을 선호합니다 (slodge.blogspot.com/2009/01/adding-row-number-using-linq-to-objects.html에서 권장 됨) 외부 변수가 수정되면 해당 솔루션이 중단되기 때문입니다.
최적으로 그룹 별 제목 단계가 먼저 수행 될 수 있으므로 "내부"그룹화 (처음에는 소스를 기준으로 색인을 계산 한 다음 색인을 사용하여 중복을 필터링 함) 각 개체의 작은 수로 작업 할 수 있습니다 "제목 별"그룹입니다. 각 제목 별 그룹의 문서 수는 보통 100 개 미만이므로 N을 원하지 않습니다. N 솔루션!
이 문제는 중첩 된 foreach 루프를 사용하여 확실히 해결할 수 있지만 LINQ를 사용하면 간단해야하는 문제인 것처럼 보입니다.
아이디어가 있으십니까?
안녕하세요 DahlbyK - 이거 멋지 네요! 귀하의 솔루션이 좋아 보인다. 이제는 처음으로 나 자신을 알아낼 수 없다는 것에 대해 나쁘게 생각하지 않습니다. Select-with-index 과부하를 발견했지만 LINQ 쿼리로 가져 오는 방법을 알 수 없습니다. 가능한 한도 내에서 도움과 교육을 주셔서 감사합니다. –