等效的LINQ查询

时间:2011-05-12 17:47:53

标签: sql-server-2008 linq-to-sql

我在SQL Server 2008中有一个history表用于学生。

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

我是LINQ的新手。

如何编写LINQ查询以获取所有活动学生的最新修改行以及相同的sql查询?

3 个答案:

答案 0 :(得分: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()
              };
}

这假设您想要所有学生,无论他们是否确实有任何历史记录。如果不想这样,您可以从历史记录表开始,按学生ID分组。

要查看SQL,您可以将变量悬停在调试中以查看生成的SQL。我懒得转换LINQ; - )

答案 1 :(得分: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)
    }

答案 2 :(得分:-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是hacky(我确信有更好的方法,但我记不起来了)而且我对SQL语法有点自信(虽然这应该指向正确的方向)如果它不完全正确),但其中任何一个都应该得到:每个当前活跃的学生的最大ModifiedAt。

.FirstOrDefault()[LINQ]或Top 1只会选择具有最新ModifiedAt的单行(只有一名学生)。