选择第一个记录每个组

时间:2013-04-10 08:21:39

标签: c# mysql linq entity-framework group-by

我正在使用Entity Framework来连接MySQL。

我有一个实现颠覆技术的增量数据。每组subversion记录具有相同的LinkedId并由UpdatedTime分隔。

我的期望是从数据库中获取每条记录的最新版本。因此,我写了一个如下所示的linq语句:

public List<Entry> LoadFinalEntries(int rptId) {
    return (from ent in ctx.Entries
           where ent.ReportId == rptId
           orderby ent.LinkedId, ent.UpdatedTime descending
           group ent by ent.LinkedId into svnEnt
           select svnEnt.FirstOrDefault()).ToList();
}

但是在运行时,它会抛出EntityCommandCompilationException告诉“不支持指定的方法。”。我知道该方法是FirstOrDefault,但无论如何都找不到它。

请帮我找另一种方法。

2 个答案:

答案 0 :(得分:1)

您如何使用内部查询?

    return (from ent in ctx.Entries
            where ent.ReportId == rptId &&
            ent.UpdatedTime ==
                (from inner in ctx.Entries
                where inner.LinkedId == ent.LinkedId &&
                inner.ReportId == rptId
                select inner.UpdatedTime).Max()
            select ent).ToList();

答案 1 :(得分:0)

在引用this article

后,我找到了更好的解决方案
public List<Entry> GetFinalEntries(int rptId) {
    // Get the latest updated time for each linked id
    var latestUpdatedTimes = from ent in ctx.Entries
                             where ent.ReportId == rptId
                             group ent by ent.LinkedId into svnEnt
                             select new { LinkedId = svnEnt.Key, UpdatedTime = svnEnt.Max(ent => ent.UpdatedTime) };

    // Compare (by joining) to get full entries
    var latestEntries = from ent in ctx.Entries
                        where ent.ReportId == rptId
                        join time in latestUpdatedTimes
                            on new { ent.LinkedId, ent.UpdatedTime } equals time
                        select ent;

    return latestEntries.ToList();
}

现在工作正常。