如何解决使用linq获取分组依据中的最新记录的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)
};
返回类似这样的内容...
Asset LastSeen BS1 2020-05-10 BS2 2020-07-10
这是我所需要的,但是然后我需要从该表行中获取其余数据,但是如果我将其连接到两列上,我可以得到多行,有没有办法让我返回分组依据中的id列,那么我可以加入吗?
谢谢
解决方法
GroupBy在这里由于SQL限制而无济于事。但是您可以编写解决方法
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;
,
I think I did what you wanted above and I wrote the full code on this link
如果不是您想要的东西,您可以清楚地写下您想要的东西吗。
var temp = from l in list
group l by l.Asset into lg
orderby lg.Key
select new { Asset = lg.Key,LastSeen = lg.Max(x => x.LastSeen),ID = lg.Where(x => x.LastSeen == lg.Max(y => y.LastSeen)).Single().ID };
,
因此,每个Scan
都有一个属性Asset
,一个DateTime属性LastSeen
以及零个或多个其他属性。
要求:给定一系列扫描,请为我提供LastSeen扫描的每个资产(全部或部分)属性。
以下将解决问题:
var lastSeenScan = dbContext.Scans.GroupBy(scan => scan.Asset,// parameter resultSelector: take every Asset,and all Scans that have this Asset value
// and order these Scans by descending value of lastSeen:
(asset,scansWithThisAssetValue) => scansWithThisAssetValue
.OrderByDescending(scan => scan.LastSeen)
// Select the scan properties that you plan to use.
// Not needed if you want the complete Scan
.Select(scan => new
{
Id = scan.Id,Operator = scan.Operator,...
})
// and keep only the First one,which is the Last seen one:
.FirstOrDefault();
换句话说:将“扫描”表划分为属性资产具有相同值的扫描组。按LastSeen的降序排列每个组中的所有扫描。这将使最后一次被查看的扫描成为第一个。
从该组的所有扫描中,仅选择您打算使用的属性,然后选择第一个。
结果:对于每一个使用的资产,您将获得具有LastSeen最高值的扫描(的选定属性)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。