2009-08-07 7 views
0

У меня есть таблица Аудит входа, я хотел бы просто извлечь последний логин для каждого пользователя, который выполнил ниже sql.Преобразование запроса Sql с помощью функции group by и/или агрегатной функции в linq to sql?

Как отформатировать запрос sql в запрос linq to sql?

SELECT * FROM AuditTable adt1 
    inner join UserTable usr 
     on adt1.[UserName] = usr.[User_Id] 
WHERE [TimeStamp] = (SELECT MAX([TimeStamp]) 
         FROM AuditTable adt2 
         WHERE adt1.UserName = adt2.UserName) 

Другой способ записи запроса в sql being;

SELECT adt1.[UserName], usr.First_Name, max([TimeStamp]) as [TimeStamp] 
FROM AuditTable adt1 
    INNER JOIN UserTable usr 
     on adt1.[UserName] = usr.[User_Id] 
GROUP BY adt1.[UserName] ,usr.First_Name 

ответ

0

У меня это работало ... ответ заключался в использовании ключевого слова let.

В качестве сторонника я настоятельно рекомендую использовать LinqPad при попытке выполнить эти действия.

from adt in AuditTable 
    join usr in UserTable 
     on adt.UserName equals usr.User_Id 
group adt by 
    new { adt.UserName, adt.Roles, usr.First_Name, usr.Last_Name } 
into g 
let LastAccessed = g.Max(a => a.TimeStamp) 
select new 
    { UserName = g.Key.UserName, 
     Roles = g.Key.Roles, 
     FirstName = g.Key.First_Name, 
     LastName = g.Key.Last_Name, 
     TimeStamp = LastAccessed 
    } 
2

запрос # 2:
из adt1 в dc.AuditTable
присоединиться к ЕГР в dc.UserTable на adt1.UserName == usr.UserID
группы adt1 по adt1.username Int ае
выбрать новый {UserName = ag.Key, TSMax = ag.Max (ts => adt1.TimeStamp)}

Почему соединение с пользовательской таблицей? Фильтр?

+0

спасибо, попал туда, в конце концов, полный ответ ниже .. :-) –