2013-04-17 4 views
0

나는이 테이블을 약간 닮았습니다.두 개의 레코드가있는 요소 목록 가져 오기

id - int 
tpc - string 
dcid - int 
other fields 

정말 tpcdcid이의 독특한 쌍. 이 시점에서 tpc은 LQ 또는 GR이 될 수 있습니다. 더 많은 정보가있을 수 있지만 지금은 단지 2 개입니다.

LINQ를 통해 레코드 목록을 보는 중, 동일한 dcid, LQ 및 GR에 대한 레코드가 두 개인 레코드가 있습니다.

그래서 다음 데이터가있는 경우;

1, GR, 1, ... 
2, LQ, 1, ... 
3, GR, 2, ... 
4, GR, 3, ... 
5, LQ, 3, ... 

반환되는 목록은 1,2,4,5입니다.
dcid 2에 대한 LQ 항목이 누락되어 목록에 3이 없습니다.

다양한 검색어를 시도했지만 tcc와 함께 두 dcid를 확인하는 논리로 고생하고 있습니다.

+0

dcid에서 GroupBy를 수행하고 개수> 1인지 확인 했습니까? – MikeSmithDev

+0

나는 그것을 생각했지만 tpc에는 언젠가 세 번째 옵션이 포함될 수 있으며 다시 방문하는 것을 싫어할 것입니다. 아무도 해결책으로 응답하지 않고 자신이 적절한 해결책을 찾지 못하면 할 것입니다. – griegs

답변

3
var required = new List<string> { "LQ", "GR" }; 
var query = data 
    .GroupBy(x => x.dcid) 
    .Where(g => g 
     .Select(x => x.tpc) 
     .Intersect(required) 
     .Count() == required.Count) 
    .Select(g => g.Key); 
0

그렇다면 올바르게 이해하면 사용 가능한 TPC 유형마다 레코드가있는 ID를 반환하고 싶습니다. 귀하의 예제에서 2 TPC 유형이 있지만 더있을 수 있습니다. 이 같은

뭔가 작동합니다

var tpcs = new List<string>(); 

var filtered = records.GroupBy(record => 
{ 
    //Keep a track of the available TPC types 
    if (!tpcs.Contains(record.TPC)) 
    { 
    tpcs.Add(record.TPC); 
    } 

    return record.DCID; 

}) 
.Where(group => 
{ 
    //Get the TPCs for the group 
    var groupTpcs = group.Select(record => record.TPC); 

    //Only return groups that have records for all the TPC types 
    return groupTpcs.Intersect(tpcs).Count() == tpcs.Count;  
}); 

//Print groups 
foreach (var group in filtered) 
{ 
    Console.WriteLine(group.Key); 
    foreach (var record in group) 
    { 
    Console.WriteLine("\tID = {0}, TPC = {1}, DCID = {2}", record.ID, record.TPC, record.DCID); 
    } 
} 

결과 :

1 
    ID = 1, TPC = GR, DCID = 1 
    ID = 2, TPC = LQ, DCID = 1 
3 
    ID = 4, TPC = GR, DCID = 3 
    ID = 5, TPC = LQ, DCID = 3 

그냥 ID를하려면 LINQ 문

.SelectMany(group => 
{ 
    //Return a list of IDs for each record in the group 
    return group.Select(record => record.ID); 
}); 

하지 말에 SelectMany 압정 그래도이 접근법을 권하고 싶습니다.

관련 문제