2011-07-04 3 views
4

SQL에서 해결하는 방법을 알고 있지만 Entity에서 Linq를 사용하지 않는 문제가 있습니다.LINQ to Entities 정렬 된 그룹의 최상위 레코드를 찾습니다

내 데이터는 다음과 같습니다 : 나는 각 그룹에서 가장 최근의 기록을 얻고하도록 (다만 ID를) 모든 엔티티 객체를 검색 할

ID GROUP TIMESTAMP 
-- ----- --------- 
1  A  2011-06-20 
2  A  2011-06-21 
3  B  2011-06-21 
4  B  2011-06-22 
5  B  2011-06-23 
6  C  2011-06-30 

.

SELECT * FROM my_table a 
WHERE a.timestamp = 
    (SELECT MAX(timestamp) FROM my_table b 
    WHERE a.group = b.group) 

(당신이 타임 스탬프를 가정 할 수있다이 질문을 위해서 각 그룹 내에서 고유 : (. 즉, IDS 2, 5와 기록, 6) SQL에서

나는 같은 것을 할 것).

Linq to Entities를 사용하는 WCF Data Service에 대해이 쿼리를 수행하고 싶습니다. 그러나 이와 같은 외부 쿼리를 참조하는 중첩 쿼리가없는 것 같습니다. 누구든지 도와 줄 수 있습니까?

답변

2
아마도 깨끗하고 손으로 쓴 버전과 효율적인 그러나 여기에서 나는이 SQL

SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Group] AS [Group], 
[Project1].[Timestamp] AS [Timestamp] 
FROM (SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Group] AS [Group], 
     [Extent1].[Timestamp] AS [Timestamp], 
     [SSQTAB1].[A1] AS [C1] 
     FROM [MyEntities] AS [Extent1] 
     OUTER APPLY 
     (SELECT 
       MAX([Extent2].[Timestamp]) AS [A1] 
       FROM [MyEntities] AS [Extent2] 
       WHERE [Extent2].[Group] = [Extent1].[Group]) AS [SSQTAB1] 
) AS [Project1] 
WHERE [Project1].[Timestamp] = [Project1].[C1] 
로 번역

var q = from a in db.MyEntities 
      where a.Timestamp == (from b in db.MyEntities 
            where b.Group == a.Group 
            select b.Timestamp).Max() 
      select a; 

해낸 무엇을하지

1

안녕하세요 linqer 귀하의 SQL 문을 linq 쿼리로 변환됩니다 사용하려고합니다.

Linqer

안부

+0

아주 멋진 도구! 나는 그것을 시도하고 지금까지 그것이 내가 원하는 것을 나에게주는 것처럼 보인다. 생성되는 쿼리는 다음과 같습니다. – codemonkey

+0

예. @codemonkey에 대한 linq 작업이 생성 되었습니까? – BizApps

+0

쿼리를 붙여 넣는 데 문제가 있었지만 제대로 작동하고 @MerickOWA의 답변과 거의 동일하게 보입니다. – codemonkey

0

정상 작동 할 것입니다 :

var query = db.my_table 
    .GroupBy(p=>p.group) 
    .Select(p=>p.OrderByDescending(q=>q.timestamp).First()); 
0

여기 있습니다. 간단한 방법.

 var result = (from x in my_table 
         group x by x.Group into g 
         select new 
         { 
          g.Key, 
          timestamp = g.Max(x => x.TimeStamp), 
          g //This will return everything in g 
         }); 
+0

이것은 "그룹"과 "타임 스탬프"를 반환하지만 Id 또는 연관된 다른 열과 같은 전체 엔티티는 반환하지 않습니다. – MerickOWA

+0

select new와 같은 select 절에 g를 추가하기 만하면됩니다. { g.Key, timestamp = g.Max (x => x.TimeStamp), g } –

관련 문제