2011-05-12 235 views
0

我有一個history表學生在SQL Server 2008中相當於LINQ查詢

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

我是新來的LINQ。

如何編寫LINQ查詢以獲取所有活動學生的最新修改行以及相同的SQL查詢?

+0

您打算使用哪種Linq? LINQ到SQL? Linq-to-Entities(實體框架)?? – 2011-05-12 18:07:09

+0

我正在使用Linq-to-SQL – Talk2me 2011-05-16 19:01:32

回答

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 2011-05-16 18:48:04

+0

只需將要分組的列添加到匿名類型即可。 – Magnus 2011-05-16 18:55:38

-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的是哈克(我敢肯定有一個更好的辦法,但我不記得了),我只是排序 - 對SQL語法充滿信心(儘管這應該指向正確的方向,即使它不完全正確),但其中任何一個都應該得到:每個當前活動的學生的最大ModifiedAt。

.FirstOrDefault()[LINQ]或Top 1將只選擇具有最新ModifiedAt的單行(只有一個學生)。

+0

我試過了sql查詢,但它沒有給我我要找的結果。我想要每個學生的單個記錄 – Talk2me 2011-05-12 19:00:07

1

喜歡的東西(假設LINQ-SQL):

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() 
       }; 
} 

這是假設你希望所有的學生,不管他們是否真的有什麼歷史。如果不想這樣,您可以從歷史記錄表格開始,按學生識別號碼進行分組。

要查看SQL,可以將該變量懸停在調試中以查看生成的SQL。我懶得轉換LINQ ;-)