Получите свойства из второго (справа) объединенного объекта с помощью Group by - PullRequest
2 голосов
/ 05 августа 2020

, пожалуйста, я работаю над проектом ASP.NET MVC с Entity Framework. Я пытаюсь написать запрос Linq, который дает мне некоторые данные, этот запрос объединит две сущности и группирует по данным, поэтому проблема в том, что когда я пытаюсь получить свойства второй объединенной сущности, я не вижу их в Intellisense, Мне нужны эти свойства, чтобы выбрать их.

Что я пробую:

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 N by N.STG_nt into G select new NT_CTR_Anal { /*Here where I want to select some properties from second entity*/ } )

Так что, пожалуйста, помогите по этой проблеме?

1 Ответ

2 голосов
/ 05 августа 2020

Взгляните на этот фрагмент:

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 внутри группирующих агрегированных методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...