我正在尝试获取用户列表及其上次登录日期。
我需要显示以下列
User Name
First Name
Last Name
Last Login Date
Role
Is Active
我遇到了困难,因为数据在两个表之间分开: 用户表:
Users
UserId
UserName
FirstName
LastName
Role
IsActive
和LogonHistory表
LogonHistory
Id
Username
LoginDate
我尝试过使用Join
,group
和max
,但它只允许我使用logonhistory表中的属性。
以下是我的join
查询示例:
var users = db.Users
.Join(db.LogonHistory, user => user.UserName, logon => logon.Username, (user, logon) => new UserSearchResults
{
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
IsActive = user.Active,
LoginHistory = logon.LoginDate
});
以下是我的group
查询示例:
var loginHistory = from l in db.LogonHistory
join u in db.Users on l.Username equals u.UserName
group l by l.Username into grp
let LastLoginDate = grp.Max(d => d.LoginDate)
from l in grp
where l.LoginDate == LastLoginDate
select l;
有人能发现我做错了什么,或者推荐一种更好的方法吗?
编辑:
基本上我需要做的是Join
Username上的User表和LogonHistory表,并返回用户的详细信息和最新的登录日期。
答案 0 :(得分:2)
您应该使用导航属性。您的查询将如下:
var loginHistory= db.Users.Select(user => new UserSearchResults
{
UserName = user.UserName,
FirstName = user.FirstName,
LastName = user.LastName,
Email = user.Email,
IsActive = user.Active,
LastLoginDate=user.LogonHistory
.OrderByDescending(e=>e.LoginDate)
.FirstOrDefault().LoginDate
});
答案 1 :(得分:2)
var lastlogins = from h in db.LogonHistory
group h by h.UserName into hgroup
select new
{
UserName = hgroup.Key,
LastLoginDate = hgroup.Max(x => x.LoginDate)
};
var query = from u in db.Users
join h in lastlogins on u.UserName equals h.Username
select new
{
u.UserName,
u.FirstName,
u.LastName,
u.Role,
u.IsActive,
h.LastLoginDate
};
答案 2 :(得分:1)
如果您使用的是EntityFramework:
var loginHistory = db.Users.select(e => new {
e.UserName,
e.FirstName,
e.LastName,
e.Role,
e.IsActive,
e.LogonHistory.OrderByDescending(ee=>ee.LoginDate).FirstOrDefault().LoginDate
});