繁体   English   中英

使用多个连接和多个选择字段从 linq 获取最大日期

[英]Get the max date from linq with mutiple joins and with multiple select fields

我一直在为此挠头,找不到解决方案。 我有一个这样的数据集,

JobID   DueDate     VisitID
4024082 2020-07-31  5267157
4024082 2020-07-29  5263915
4024082 2020-08-04  5269154
4024082 2020-07-23  5258774
4024082 2020-07-22  5255307

我想得到这样的结果集,

JobID   Duedate     VisitID
4024082 2020-08-04  5269154

我尝试了多种方法,但无法使其正常工作。 我的 linq 查询是

            var jobs = await (from j in _ctx.Jobs
                              join v in _ctx.Visits on j.JobID equals v.JobID
                              join p in _ctx.Products on j.ProductID equals p.ProductID
                              where j.IsProcessed== true
                              group v by new
                              {
                                  v.JobID,
                                  v.VisitID
                              }
                into g
                              select new
                              {
                                  JobId = g.Key,
                                  DueDate = g.Max(x => x.DueDate),
                                  VisitID = g.Key.VisitID
                              }).ToListAsync();

任何帮助将不胜感激。 谢谢

您不能使用Max获得多个值。 您必须在这里使用排序机制。

下面是一个示例,说明如何获取按JobID分组的JobID ,然后是每个最高日期以及随附的VisitID

这是示例。 (我用 LinqPad 来测试这个):

void Main()
{
    var jobs = new[]
    {
        new Job { JobID = 4024082, DueDate = DateTime.ParseExact("2020-07-31", "yyyy-MM-dd", CultureInfo.InvariantCulture), VisitID = 5267157 },
        new Job { JobID = 4024082, DueDate = DateTime.ParseExact("2020-07-29", "yyyy-MM-dd", CultureInfo.InvariantCulture), VisitID = 5263915 },
        new Job { JobID = 4024082, DueDate = DateTime.ParseExact("2020-08-04", "yyyy-MM-dd", CultureInfo.InvariantCulture), VisitID = 5269154 },
        new Job { JobID = 4024082, DueDate = DateTime.ParseExact("2020-07-23", "yyyy-MM-dd", CultureInfo.InvariantCulture), VisitID = 5258774 },
        new Job { JobID = 4024082, DueDate = DateTime.ParseExact("2020-07-22", "yyyy-MM-dd", CultureInfo.InvariantCulture), VisitID = 5255307 },
    };
    
    var query = from job in jobs
                group job by job.JobID into grp
                select grp.OrderByDescending(g => g.DueDate).FirstOrDefault();
    
    query.Dump();
}

public class Job
{
    public int JobID { get; set; }
    public DateTime DueDate { get; set; }
    public int VisitID { get; set; }
}

输出:

JobID    DueDate            VisitID
4024082  4-8-2020 00:00:00  5269154 

我认为问题在于您使用VisitId作为GroupBy一部分。 由于所有VisitId值都是唯一的,您将获得每个组的单个记录(因此每个记录对应一个组)。

如果您想要这些示例记录中的一组,也许您应该只加入JobId 然后拿到VisitID对于有最新的行DueDate ,我们可以订购由该组DueDate (下降),并采取VisitIDFirst()的记录:

var jobs = await (from j in _ctx.Jobs
                  join v in _ctx.Visits on j.JobID equals v.JobID
                  join p in _ctx.Products on j.ProductID equals p.ProductID
                  where j.IsProcessed== true
                  group v by v.JobID
                  into g
                      select new
                      {
                          JobId = g.Key,
                          DueDate = g.Max(x => x.DueDate),
                          VisitID = g.OrderByDecending(x => x.DueDate).First().VisitID
                      }).ToListAsync();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM