如何 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 编写方法,但我不知道如何让它正常工作。发生的事情太多了,我的小脑袋无法处理哈哈。如果有人对我如何制作这种清洁剂有任何想法,请告诉我,以便我学习。
我这辈子都无法 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 编写方法,但我不知道如何让它正常工作。发生的事情太多了,我的小脑袋无法处理哈哈。如果有人对我如何制作这种清洁剂有任何想法,请告诉我,以便我学习。