эквивалентный запрос LINQ - PullRequest
0 голосов
/ 12 мая 2011

У меня есть таблица history для студентов в SQL Server 2008.

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

Я новичок в LINQ.

Как мне написать запрос LINQ, чтобы получить последнюю измененную строку для всех активных учащихся, а также эквивалентный SQL-запрос для того же самого?

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Что-то вроде (при условии 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; -)

0 голосов
/ 13 мая 2011
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 голосов
/ 12 мая 2011

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. * ​​1009 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...