2014-07-21 8 views
3
에 의해 그룹과 예제가 있습니다

- 카운트 또는 웹에서 LINQ으로 최소 날짜을 선택하지만 특정 솔루션을 찾을 수 없습니다 가진 은 내 질문에. 또한 나는 지금까지 발견 한 이러한 솔루션을 결합 할 수있는 고급 linq 이해가 없다.그룹으로와 LINQ와 최소 (문자열)을 갖는 제

select client_id 
from my_table /* Column1 : client_id, Column2 : _month */ 
group by client_id 
having min(_month) = '2009-11' 

내 질문한다 : 어떻게 C#을 LINQ에이 쿼리 변환 할 수 있습니다

나는이 같은 SQL 쿼리가?. 은 지금까지 나는 이런 식으로 뭔가를 썼다하지만 내가 가지고 무엇을 제공하지 않습니다

var query = dataTable.AsEnumerable() // This is my_table 
    .GroupBy(c => c.Field<Int32>("client_id")) 
    .Select(g => new 
    { 
     g.Key, 
     minMonth = g.Min(c => c.Field<string>("_month")) 
    }) 
    .Where(d => d.minMonth == "Some String like '2009-11'"); 

을 실제로 내게 필요하지 않은이 SQL의 결과를 제공합니다

select client_id, min(_month) 
from my_table 
where _month = '2009-11' 
group by client_id 

을 참고 : _month는 YYYY-MM과 같은 형식의 문자열입니다.

답변

5

이 시도 :

var results = mytable.GroupBy(x => x.client_id) 
        .Where(x => x.Min(y => DateTime.ParseExact(y._month,"yyyy-MM",null)) 
            == new DateTime(2009,11,1)) 
        .Select(x=>x.Key); 

having 절은이 LINQ 문에서 Where 내에서 구현된다. client_id을 그룹화 한 후에 _monthmin 집계 함수를 구현하려면 x.Min을 사용하고 ParseExact 메서드를 사용하여 비교를 위해 1 년 조합으로 구문 분석합니다.

OP가 제공 한 SQLFiddle에서 4 개의 레코드가 반환됩니다. A demo 동일한 데이터를 사용하고 위의 쿼리는 동일한 4 개의 레코드를 반환합니다.

+1

@ Pieter Geerkens 편집 주셔서 감사합니다 –

+0

문자열을 직접 생성하지 않고 왼쪽 datetime을 구문 분석하는 이유는 무엇입니까? – abatishchev

+0

@abatishchev 충분히 공정하게 직접 수행 할 수도 있습니다. 나는 그것을 포함하도록 내 대답을 업데이트 할 것이다. '_month'는 제가 이해하는 문자열입니다. 그래서 파싱되어야합니다. –