2014-11-13 4 views
2

저는 엔티티 프레임 워크가있는 데이터베이스에 연결된 C#의 모델 클래스를 사용하고 있습니다. 필자의 모델에서는 사용자 값과 항목이 기록 된 시간을 기록합니다. 내가 원하는 것은 주어진 UserID에 대한 가장 최근의 레코드만을 나타내는 일련의 엔트리를 반환하는 것이다.LINQ의 집계 쿼리와 자체 조인

집계 쿼리 (최대 날짜, 사용자 ID로 그룹화)와 자체 조인을 사용하여 SQL에서이를 수행하여 해당 매개 변수를 올바른 레코드와 일치시킬 수 있습니다.

DECLARE @UserValues 
    TABLE 
    (
     id INT IDENTITY(1,1) PRIMARY KEY, 
     UserID INT, 
     Value CHAR, 
     RecordedAt DATETIME 
    ) 

INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'a', '2014-11-06'; 
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'b', '2014-11-08'; 
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 3, 'c', '2014-11-04'; 
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'f', '2014-11-03'; 
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'h', '2014-11-23'; 
INSERT INTO @UserValues (UserID, Value, RecordedAt) SELECT 5, 'w', '2014-11-07'; 

select straight_data.* 
from 
(
    select UserID   as UserID, 
      MAX(RecordedAt) as RecordedAt 
     from @UserValues 
    group by UserID 
) as max_date 
join @UserValues as straight_data 
    on max_date.RecordedAt = straight_data.RecordedAt 
and max_date.UserID  = straight_data.UserID 

결과 각 사용자에 대한 가장 최근의 기록 : http://sqlfiddle.com/#!6/7c4dc/1

그래서 질문은, 어떻게 내가 아래 동작을 수행 할됩니다 :

id UserID Value RecordedAt 
5 5  h  2014-11-23 00:00:00.000 
2 3  b  2014-11-08 00:00:00.000 

여기에 직접보기 LINQ like,

ICollection<UserValues> MyUserValues; 

답변

3

다음 단계를 사용하여 linq에서이 작업을 수행 할 수 있습니다. S :

userId를

에 의해 그룹

주문 RecordedAt하여 각 그룹마다 "그룹"에서

선택 우선 (내림차순). 당신이

+0

브릴리언트 (개체 만에 LINQ에 대한) MoreLinq을 사용하는 경우

var dataByUserAndMaxDate = MyUserValues.GroupBy(m => m.UserId) .Select(m => m.OrderByDescending(x => x.RecordedAt).First()); 

MaxBy 확장 메서드있다, 난 여기가 테스트 : https://dotnetfiddle.net/BUwR3L – darkpbj