【问题标题】:How to select top result for a given ID then join that into another table EF Core LINQ如何为给定 ID 选择最高结果,然后将其加入另一个表 EF Core LINQ
【发布时间】:2020-07-22 05:57:56
【问题描述】:

对于我的一生,我无法通过谷歌搜索我的出路。

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

本质上,我正在尝试从“UserLogins”表中获取最新的登录条目,并将其与“Computers”表中的相应条目连接起来。

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

下面是一些我知道的 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 类中实现它,我正在使用: EF 核心 (3.1.2) ASP.NET Core (3.1)

我确实有几个我正在尝试返回结果的查询,但我无法在没有错误的情况下加入它们:

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

【问题讨论】:

    标签: c# entity-framework linq asp.net-core-webapi sql-to-linq-conversion


    【解决方案1】:

    所以我觉得我找到了一种完成这项工作的捷径。不确定它是否正确,但这是我想出的:

    我创建了一个名为“ComputerInfoFull”的新类,它基本上只是“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 方式来编写这个,但我不知道如何让它正常工作。我的小脑袋要处理的事情太多了,哈哈。如果有人对如何制作这种清洁剂有任何想法,请告诉我,以便我学习。

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2022-01-17
      • 2020-08-26
      相关资源
      最近更新 更多