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

C# 使用Linq如何从两个表中获取用户列表及其上次登录,c#,linq,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

我正在尝试获取用户列表,以及他们的上次登录日期

我需要显示以下列

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和MAXA,但它只允许我使用logonhistory表中的属性

以下是我的joinquery示例:

下面是我的分组查询示例:

    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;
有人能发现我做错了什么,或者推荐一种更好的方法吗

编辑:
基本上,我需要做的是在用户名上加入用户表和LogonHistory表,并返回用户的详细信息和最新登录日期。

如果您使用的是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
});

如果您使用的是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
});

您应该改用导航属性。您的查询如下:

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

您应该改用导航属性。您的查询如下:

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

您使用的是实体框架吗?是的,我使用的是实体框架。您使用的是实体框架吗?是的,我使用的是实体框架。您的解决方案的问题是EF可以以任何特定顺序检索与用户关联的LogonHistory,不保证它们以相同的顺序插入,这就是为什么我使用order By您的解决方案的问题是EF可以以任何特定顺序检索与用户关联的LogonHistory,不能保证它们以相同的顺序插入,这就是为什么我使用order By我现在明白您在做什么了。但是我没有得到正确的结果,因为当创建表时,LogonHistory和用户没有通过主键关联,所以EF不能执行user.LogonHistory。不过这是个很好的回答,谢谢。我现在明白你在做什么了。但是我没有得到正确的结果,因为当创建表时,LogonHistory和用户没有通过主键关联,所以EF不能执行user.LogonHistory。不过这是一个很好的答案,谢谢。