Linq GroupПродолжить? - PullRequest
       1

Linq GroupПродолжить?

0 голосов
/ 23 марта 2012

Использование EF4 и Linq

У меня есть структура данных, которая выглядит следующим образом:

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

То есть я хочу выбрать парентид, childid, но только для самой высокой версии, для каждой парентиды в базе данных.

Моя первая попытка была такой:

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

Однако, это, очевидно, выбирает только один из дочерних идентификаторов для каждого родительского идентификатора.

В приведенных выше примерах данных я хочу получить дочерние идентификаторы 2,3,5 из версии 2 для родителя 1, то есть ..

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

В итоге я использовал такой подзапрос:

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 ....);

Таким образом, я получаю все парентиды в БД только с детьми с максимальной версией для этого конкретного родителя.

0 голосов
/ 23 марта 2012

Это должно соответствовать вашему требованию ..

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});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...