Linq 林克·GroupBy TakeWhile?
使用EF4和Linq 我的数据结构如下所示:Linq 林克·GroupBy TakeWhile?,linq,entity-framework-4,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 ... var links = da
parentid childid version
1 2 1
1 3 1
1 4 1
1 2 2
1 3 2
1 5 2
...
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选择parentid、childid,但只针对最高版本
我的第一次尝试是:
var links = data
.GroupBy (link => link.parentid)
.Select(ig => ig.OrderByDescending(link => link.version).First())
.Select ( link => new ....... );
但是,这显然只为每个父id选择一个子id
在上面的示例数据中,我想从版本2中获取父1的子ID 2,3,5,即..这应该满足您的要求
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});
我最终使用了如下子查询:
parentid childid version
1 2 1
1 3 1
1 4 1
1 2 2
1 3 2
1 5 2
...
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,其中只有该特定父项的最大版本的子项。这甚至不是有效的代码。版本是一个标量字段,因此不能在max查询中使用。您应该按parentid分组,并在parentid中按版本分组。我现在没有时间解决这个问题。如果还有必要,我会稍后再试。