Получите максимальное значение в дочерней таблице с помощью LINQ lambda - PullRequest
0 голосов
/ 02 июля 2018

, поэтому у меня есть данные следующим образом (обратите внимание, что эти таблицы упрощены):

Header:    
Id    
1    
2    
3

Child:    
Id  HeaderId  Code  Round      
1   1         A     1
2   1         A     2
3   1         B     1
4   2         A     1
5   2         B     1
6   2         C     1
7   3         A     2
8   3         B     1
9   3         A     1

Я хочу посчитать, сколько заголовков, у которых нет дочернего элемента B в их максимальном раунде, из таблиц данных выше результата должно быть 2, потому что:

  1. Заголовок 1 не имеет B в раунде 2 (максимальный раунд заголовка 1 равен 2)

  2. Заголовок 2 имеет B в раунде 1

  3. Заголовок 3 не имеет B в раунде 2 (максимальный раунд заголовка 3 равен 2)

это linq, который я пробовал

var result = data.Where(e =>
                 !e.Child.Any(a =>
                        a.Code == "B" &&
                        a.Round == e.Child.Max(c => c.Round))).Count();

но не работает и я получил это

ORA-00904: «Extent1». «EXPENSE_ID»: неверный идентификатор

"Extent1". "ID" - это столбец Id в таблице заголовков

как я могу получить максимальный раунд в этом случае?

----- решено, спасибо -----

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Оказывается, мой linq не работает, потому что var result - это IQueryable, поэтому мне нужно изменить его на Список с помощью .ToList(), прежде чем изменить его на Queryable с помощью .AsQueryable() (при необходимости), это окончательный linq:

var result = data.ToList().Where(e =>
             !e.Child.Any(a =>
                    a.Code == "B" &&
                    a.Round == e.Child.Max(c => c.Round))).Count();

спасибо всем, кто мне помог

0 голосов
/ 03 июля 2018

Все, что вам нужно, это таблица Child. Вы можете сгруппировать детей по HeaderId, а затем найти максимальное значение Round для каждого HeaderId и проверить детей в этом раунде на Code.

var ans = Child.GroupBy(c => c.HeaderId)
                .Where(cg => {
                    var maxRound = cg.Max(c => c.Round);
                    return cg.Where(c => c.Round == maxRound).All(c => c.Code != "B");
                })
                .Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...