如何在分组LINQ查询中获取关联实体sonuc的最新记录ID
获取关联实体sonuc的最新记录ID解决方案
嘿,我来帮你解决这个问题!你已经能顺利获取type1实体的最新ID了,要同时拿到sonuc(也就是type3)的最新记录ID,其实有两种很直观的方案,我给你详细说说:
方案一:分组时携带所需实体信息
我们可以调整分组逻辑,把type1和type3的信息一起纳入分组,这样在后续的select阶段就能直接从分组里筛选sonuc的最新记录:
var query = (from type1 in lohusaHastaRepo join type2 in hastaRepo on type1.HastaTC equals type2.HastaTC join type3 in gebeSonucBildirimRepo on type1.HastaTC equals type3.HastaTC // 将type1和type3打包后按HastaTC分组 group new { type1, type3 } by type2.HastaTC into grp select new SomeModel() { // 获取sonuc的最新ID:替换成你业务里判断记录新旧的字段(比如创建时间/更新时间) Type3ID = grp.Select(g => g.type3) .OrderByDescending(s => s.CreateDate) // 这里换成sonuc实体的时间字段,比如SonucTarihi .Select(s => s.ID) .FirstOrDefault(), // 保留你原本获取type1最新ID的逻辑 Type1ID = grp.Select(g => g.type1) .OrderByDescending(o => o.BirthDate) .Select(s => s.ID) .FirstOrDefault() });
这个方案的好处是所有关联逻辑都在初始查询里完成,分组后直接操作已有数据,不需要额外的查询请求。
方案二:分组后直接关联查询
如果觉得打包实体分组有点繁琐,也可以在分组后的select阶段,直接用分组的Key(也就是HastaTC)去查询gebeSonucBildirimRepo里的最新记录:
var query = (from type1 in lohusaHastaRepo join type2 in hastaRepo on type1.HastaTC equals type2.HastaTC group type1 by type2.HastaTC into grp select new SomeModel() { // 用分组的HastaTC过滤sonuc,再取最新ID Type3ID = gebeSonucBildirimRepo .Where(s => s.HastaTC == grp.Key) .OrderByDescending(s => s.CreateDate) // 同样替换成实际的时间字段 .Select(s => s.ID) .FirstOrDefault(), // 原有的type1最新ID逻辑不变 Type1ID = grp.OrderByDescending(o => o.BirthDate) .Select(s => s.ID) .FirstOrDefault() });
这个方案更简洁,不需要提前join type3,不过要注意ORM(比如EF Core)会自动把这个子查询转换成高效的SQL,性能上和方案一相差不大。
重要提醒
一定要记得把代码里的CreateDate替换成sonuc实体中真正用来判断记录新旧的字段,比如如果业务上是按记录的生成时间排序,就用SonucOlusturmaTarihi;如果是按更新时间,就用GuncellemeTarihi,否则无法拿到正确的最新记录ID。
内容的提问来源于stack exchange,提问作者Yener
相关产品推荐
相关产品推荐

