我在SQL Server 2008中有一个history
表用于学生。
StudentHistoryId, StudentId, Grade, CreatedAt, ModifiedAt, ModifiedBy, Active
我是LINQ的新手。
如何编写LINQ查询以获取所有活动学生的最新修改行以及相同的sql查询?
答案 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的单行(只有一名学生)。