Взгляните на этот фрагмент:
group N by N.STG_nt into G
Часть между by
и into
является ключом (ключами), и аналогично SQL там у вас есть доступ ко всем псевдонимам ( переменных) из предложений from
и join
. Имя после into
- это спецификация LINQ c и представляет собой псевдоним (переменную) для доступа к результату GroupBy
. Но что находится между group
и by? Не существует эквивалента SQL.
Итак, результат GroupBy
имеет тип IGrouping<TKey, TElement>
, который имеет свойство TKey Key
, а также IEnumerable<TElement>
. TKey
является частью выражения между by
и into
, а TElement
(то, что вы можете получить через переменную into
, происходит из выражения между group
и by
.
В вашем примере вы поместили туда N
, поэтому у вас есть доступ только к его свойствам.
Чтобы иметь доступ к другим свойствам, вы должны использовать типичную конструкцию LINQ для "составных" вещей, которые являются проекциями анонимного типа, например,
var R = (
from N in SCHOOL_DB_Context.Con.NT_CTR
join S in SCHOOL_DB_Context.Con.STGs on N.STG_nt equals S.CD_STG
where N.CTR_nt == CTR
group new { N, S } by N.STG_nt into G
select new NT_CTR_Anal
{
G.Key, // N.STG_nt
SomeNPropSum = G.Sum(e => e.N.SomeNProp),
SomeSPropSum = G.Sum(e => e.S.SomeSProp),
};
Как видите, теперь у вас есть доступ к свойствам N
и S
внутри группирующих агрегированных методов.