Linq GroupBy TakeWhile?

时间:2012-03-23 10:31:46

标签: linq entity-framework-4

使用EF4和Linq

我有一个如下所示的数据结构:

 parentid   childid  version
        1         2        1
        1         3        1
        1         4        1
        1         2        2
        1         3        2
        1         5        2
     ...

也就是说,我想选择parentid,childid,但只针对最高版本,因为数据库中存在每个parentid。

我的第一次尝试是:

var links = data
           .GroupBy (link => link.parentid)
           .Select(ig => ig.OrderByDescending(link => link.version).First())
           .Select ( link => new ....... );

但是,这显然只为每个父ID选择一个子ID ..

在上面的示例数据中,我希望从父版1的版本2获取子ID 2,3,5 ..

2 个答案:

答案 0 :(得分:0)

这应符合您的要求..

var links = data.Where(x => x.version == data.Max(y => y.version))
                .OrderBy(x => x.childid)
                .Select(x => new {parentid = x.parentid, childid = x.childid});

如果您只需要父母1,那么

 var links = data.Where(x => x.version == data.Max(y => y.version))
                 .Where(x => x.parentid == 1)
                 .OrderBy(x => x.childid)
                 .Select(x => new {parentid = x.parentid, childid = x.childid});

答案 1 :(得分:0)

我最终使用了这样的子查询:

var links = data
    .OrderBy(link => link.parentid)
    .ThenBy(link => link.childid)
    .Where(o => o.version == data
            .Where(i => i.version == o.version).Max(l => l.version))
    .Select(link => new ....);

这样,我得到了数据库中的所有parentid,只有具有该特定父项的最大版本的子项。