Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 林克·GroupBy TakeWhile?_Linq_Entity Framework 4 - Fatal编程技术网

Linq 林克·GroupBy TakeWhile?

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

使用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 = 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中按版本分组。我现在没有时间解决这个问题。如果还有必要,我会稍后再试。