c# - 使用linq获取group by中最新记录的id
问题描述
我正在尝试获取 linq 中某个组的最新记录,但我想要的是 id,而不是日期,因为有时日期可能与其他记录完全相同。
以下代码为我提供了密钥和最后日期
var latestPositions = from bs in Scan
group bs by bs.Asset into op
select new
{
Asset = op.Key,
LastSeen = op.Max(x => x.LastSeen)
};
返回这样的东西......
资产 LastSeen BS1 2020-05-10 BS2 2020-07-10
这是我需要的,但是我需要从该表行中获取其余数据,但是如果我在两列上加入它,我可以获得多行,有没有办法让我返回 id 列group by,所以我可以加入吗?
谢谢
解决方案
由于 SQL 限制,GroupBy 在这里无法提供帮助。但是您可以编写解决方法
var latestPositions = from bs in Scan
where !Scan.Any(s => s.Asset == bs.Asset && s.LastSeen > bs.LastSeen)
select bs;
但我不得不提一下,最快的方法是使用 EF Core 中不可用的窗口函数:
SELET
sc.Id
FROM (
SELECT
s.Id,
ROW_NUMBER() OVER (PARTITION BY s.Asset ORDER BY s.LastSeen DESC) AS RN
FROM Scan s
) sc
WHERE sc.RN == 1
但是存在 EF Core 扩展linq2db.EntityFrameworkCore这使得通过 LINQ 成为可能(我假设 Asset 只是 ID,而不是导航属性)
var queryRn = from bs in Scan
select new
{
Entity = bs,
RN = Sql.Ext.RowNumber().Over()
.PartitionBy(bs.Asset).OrderByDesc(bs.LastSeen).ToValue()
};
// switch to alternative translator
queryRn = queryRn.ToLinqToDB();
var latestPositions = from q in queryRn
where q.RN == 1
select q.Entity;
推荐阅读
- css - VSCode 智能感知充斥着 typescript 中的 css 类
- go - 类型与 []byte 属性上的投影不匹配
- javascript - 电子工作者:隐藏的 BrowserWindow 导致前端滞后
- bash - Bash 脚本:如何从文件中读取作为参数传递的行,并将其存储在变量中
- android - 如何将经过的时间从现在转换为该日期并将该方法传递给kotlin中的viewholder
- javascript - Laravel - Ajax 调用时出现 500(内部服务器错误)
- c# - 如何获得“在 C# 桌面应用程序中调用 API 时使用了多少网络数据(移动或 WiFi)”
- reactjs - 错误:react-pdf 中 EOF 之后的 stream.push()
- javascript - 从 DOM 对象创建 DOM 树字符串的递归函数
- python - 如何安装 Tensorflow 我有问题