如何 select 给定 ID 的最高结果然后将其加入另一个 table EF Core LINQ

How to select top result for a given ID then join that into another table EF Core LINQ

我这辈子都无法 google 摆脱困境。

我在一个数据库中有 2 个 table 1.电脑 2. 用户登录

本质上,我试图从 "UserLogins" table 中获取最新的登录条目,并将其与 "Computers" table 中的相应条目相结合。

这听起来很简单,但我还没有完成足够的 LINQ/EF 核心课程,似乎还没有弄清楚如何正确地做到这一点。

这里有一些 SQL 我知道它的功能如何:

SELECT * FROM ComputerInfo 
LEFT JOIN (
    SELECT LoginID, UserID, l.ComputerName, IpAddress, l.LoginTime FROM UserLogins as l
    INNER JOIN (
    SELECT ComputerName, MAX(LoginTime) as LoginTime
    FROM UserLogins
    GROUP BY ComputerName) as max on max.ComputerName = l.ComputerName and max.LoginTime = l.LoginTime
    ) as toplogin on toplogin.ComputerName = ComputerInfo.ComputerName

作为参考,我将在我的 Controller.cs class 中实现它,并且我正在使用: EF 核心 (3.1.2) ASP.NET 核心 (3.1)

我确实有几个查询,我正在试验 return 结果,但我无法正确加入它们:

var computerQuery = _context.ComputerInfo
                    .OrderBy(on => on.ComputerName)

var userQuery = _context.UserLogins
                .Select(p => p.ComputerName)
                .Distinct()
                .Select(id => _context.UserLogins
                .OrderByDescending(p => p.LoginTime)
                .FirstOrDefault(p => p.ComputerName == id))
                .ToListAsync();

所以我想我找到了一个简单的方法来完成这件事。不确定它是否正确,但这是我想出的:

我创建了一个名为 "ComputerInfoFull" 的新 class,它基本上只是 "ComputerInfo" && "UserLogins" 的组合,并将其用于 linq 查询:

var initial = from computerInfo in _context.ComputerInfo
                          from userInfo in _context.UserLogins
                              .Where(o => o.ComputerName == computerInfo.ComputerName)
                              .OrderByDescending(o => o.LoginTime).Take(1)
                          select new ComputerInfoFull(computerInfo, userInfo);

我非常确定有一种更简洁的 Lambda 编写方法,但我不知道如何让它正常工作。发生的事情太多了,我的小脑袋无法处理哈哈。如果有人对我如何制作这种清洁剂有任何想法,请告诉我,以便我学习。