2011-05-12 239 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 ;-)