使用Linq如何从两个表中获取用户列表及其上次登录

时间:2016-12-05 18:04:18

标签: c# linq

我正在尝试获取用户列表及其上次登录日期。

我需要显示以下列

User Name
First Name
Last Name
Last Login Date
Role
Is Active

我遇到了困难,因为数据在两个表之间分开: 用户表:

Users
    UserId
    UserName
    FirstName
    LastName
    Role
    IsActive

和LogonHistory表

LogonHistory
    Id
    Username
    LoginDate

我尝试过使用Joingroupmax,但它只允许我使用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表,并返回用户的详细信息和最新的登录日期。

3 个答案:

答案 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
});