2014-09-08 1 views
1

다음 쿼리를 수행하는 데 LINQ to Entities를 어떻게 사용합니까?LINQ 버전의 최대 및 그룹을 사용하는 하위 쿼리

동일한 ID를 가진 테이블에 여러 항목이 있으므로 최대 ID 값을 가진 각 ID 중 하나만 입력하면됩니다. 또한 dateValue에는 시간 구성 요소가 밀리 초 단위로 포함되어 복제되지 않습니다.

은 내가 context.tableName.Any() 방법을 사용하거나 선택 부분 내부에 쿼리를 추가함으로써 그러나 나는 여전히 하위 쿼리로 작업 할 수 있습니다 읽은 IN 키워드를 지원하지 않는 엔티티에 LINQ를 알고있다.

Using context = ContextProvider.GetContext() 
    Dim table = context.tableName 

    Dim query = _ 
     From rows In table _ 
     Select New ClassName With _ 
       { _ 
        .Id = rows.Id, _ 
        .Value1 = rows.Value1, _ 
        .Value2 = rows.Value2, _ 
        .DateValue = rows.DateValue _ 
       } 

    Return query.ToList() 
End Using 

내가 원하는 것을 얻을 쿼리에 Where table.Any(..., 또는 선택의 .DateValue = subquery을가할지 잘 모르겠어요, 위의 주어진. 그리고 어느 상황에서든 표현식의 형식을 지정하는 방법을 모르겠습니다.

+0

왜 MAX (dateValue)를 원한다면 하위 쿼리에서 ID별로 그룹화 하시겠습니까? MAX (dateValue)를 사용하여 ID 당 최고 1 레코드를 원하십니까? 그런 다음 SQL 쿼리가 올바르지 않습니다. –

+0

예, 동일한 ID를 가진 항목이 여러 개 있습니다. 해당 ID의 날짜가 가장 큰 ID 당 1 개의 항목 만 입력하면됩니다. –

+0

테이블의 기본 키는 무엇입니까? –

답변

1

실제로 하위 쿼리와 주 쿼리 이외의 다른 날짜와의 관계가 없으므로 sql이 이미 올바르지 않습니다. 다른 ID의 max-dateValue 인 dateValue가있는 ID가 있으면 잘못된 ID로이 레코드를 가져옵니다. 당신은 ID 당 최대 날짜와 기록을 원하는 경우

그래서 내가 할 것 :

WITH CTE AS 
(
    SELECT rn = ROW_NUMBER() OVER (PARTITION BY [id] ORDER BY [dateValue] DESC), 
      [id] ,[value1], [value2], [dateValue] 
    FROM table 
) 
SELECT [id] ,[value1], [value2], [dateValue] 
FROM CTE 
WHERE RN = 1 

는 LINQ에서이 작동합니다 (난과 그 익숙하지 않다 Linq에 - 투 - 엔티티) :

Dim query = From row In table 
      Group row By row.Id into idGrp 
      Let MaxDatePerID = idGrp.Max(Function(r) r.DateValue) 
      From idRow In idGrp 
      Where idRow.DateValue = MaxDatePerID 
      Select New ClassName With 
      { 
       .Id = idRow.Id, 
       .Value1 = idRow.Value1, 
       .Value2 = idRow.Value2, 
       .DateValue = idRow.DateValue 
      } 
+0

테이블에 대해 일반 SQL 쿼리를 실행했는데 정확한 결과를 돌려줍니다. 테이블의 각 id에 대해 'SELECT MAX (dateValue) FROM table Where id = ...'를 사용하여 날짜를 개별적으로 두 번 확인했습니다. 날짜가 일치합니다. 귀하의 방법이 잘못되었다는 것을 말하는 것이 아니며, 시도해 볼 것입니다. 그러나 제 SQL 문은 귀하가 제안한 것처럼 정확하지는 않습니다. –

+1

@JeremyK : 1)'ID = 1, DateValue = 2014/9/7' 2)'ID = 1, DateValue = 2014/9/8' 3)'ID = 2, DateValue = 2014/9/7'. 날짜가 다른 ID의 최대 날짜 인 날짜이므로이 ID의 최대 날짜가 아니더라도 첫 번째 레코드를 가져옵니다. –

+0

아, 알겠습니다. 이는 일부 사람들에게는 유효한 우려 일 수 있습니다. DateTime 값이 밀리 세컨드에 이르기 때문에 그 상황을 결코 얻지 못할 것입니다. 나는 그것에 대해 분명히해야만했습니다. 죄송합니다. –