2011-05-12 3 views
0

나는 SQL 서버 2008해당하는 LINQ 쿼리

StudentHistoryId, StudentId, Grade, CreatedAt, ModifiedAt, ModifiedBy, Active 

내가 LINQ에 새로운 오전에 학생들을위한 history 테이블이 있습니다.

모든 활성 학생에 대해 최신 수정 행을 가져 오려면 LINQ 쿼리를 작성하고 이에 대한 동등한 SQL 쿼리는 어떻게 작성합니까?

+0

Linq의 어떤 맛을 사용 하시겠습니까 ?? Linq-to-SQL? Linq - 엔터티 (엔터티 프레임 워크) ?? –

+0

Linq-to-SQL – Talk2me

답변

0
var q = 
    from h in history 
    where h.Active 
    group h by new { h.StudentId, h.Grade } into g 
    select new 
    { 
     StudentId = g.Key.StudentId, 
     Grade = g.Key.Grade, 
     LatestModified = g.Max (x => x.ModifiedAt) 
    } 
+0

모든 항목을 원합니다. – Talk2me

+0

그룹화하려는 열을 익명 유형에 추가하기 만하면됩니다. – Magnus

-1

LINQ

var tempresult = (from student in Students 
        where Active == true).OrderByDesc(ModifiedAt) 
List<Student> results = new List<Student>(); 
foreach(var result in tempResult) 
{ 
    if((results.Where(r => r.StudentId == result.StudentId).FirstOrDefault()) == null) 
    { 
     results.Add(result); 
    } 
} 

SQL

Select [Rows] 
From Students S 
Where S.Active = 1 
And S.ModifiedAt = (Select Max(ModifiedAt) 
        From Student S1 
        Where S1.StudentId = S.StudentId) 

Linq의 (그리고 나는 더 나은 방법이있을거야,하지만 난 그것을 기억할 수) 해키하고 난 단지 sort- 해요 SQL 구문에 대한 자신감이 있습니다 (정확히 맞지는 않지만 올바른 방향으로 가리켜 야합니다).하지만 그 중 하나는 다음을 가져야합니다. 현재 활성 상태 인 모든 학생의 최대 수정 된 수입니다.

.FirstOrDefault() [LINQ] 또는 Top 1은 최근 ModifiedAt가있는 단일 행 (한 학생 만)을 선택합니다. (LINQ-SQL을 가정) 같은

+0

SQL 쿼리를 시도했지만 찾고있는 결과를 얻지 못했습니다. 각 학생에 대한 단일 기록을 원합니다. – Talk2me

1

뭔가 : 이것은 관계없이 실제로 어떤 역사를 가지고 있는지 여부, 당신은 모든 학생들을한다고 가정한다

using (YourDataContext db = new YourDataContext()) 
{ 
    var data = from s in db.Students 
       select new 
       { 
        StudentId = s.StudentId, 
        LastHistory = s.Histories 
           .OrderByDescending(s => s.ModifiedAt) 
           .Where(s => s.Active) 
           .FirstOrDefault() 
       }; 
} 

. 이것을 원하지 않는다면, History 테이블로 시작하고 Student ID로 그룹화 할 수 있습니다.

디버거에서 변수를 가리켜 생성 된 SQL을 볼 수 있습니다. 나는 LINQ를 변환하기에는 너무 게을 리다 ;-)