2015-10-02 2 views
0

У меня есть выражение Lambda, которое возвращает данные, правильно отфильтрованные, но мне нужно сделать некоторые вычисления по возвращенным записям.Entity Framework Count и Group By in Collection

У меня есть два объекта (Пользователь и язык), которые имеют отношения «многие ко многим», и мне нужно сделать сгруппированное количество языков репатриантов, чтобы узнать, сколько людей говорит на каждом возвращенном языке.

Пример набора данных, возвращаемых лямбда-выражения:

  • User1 (английский, испанский)
  • Пользователь2 (английский, французский)
  • User3 (английский, испанский)

Желаемый результат:

  • English 3
  • Испанских 2
  • Французских 1

Я пытался использовать GroupBy() и выберите(), но только получил правильный результат с Еогеаспом над результатами, но хотелось бы сделать это с помощью лямбды ,

[EDIT] Ключ раствор результаты уплощение использованием SelectMany() в сочетании с GroupBy(). Спасибо @ Christos, назови правильный ответ.

+0

Отношение «много-много», поэтому каждый язык должен иметь какое-либо свойство навигации, такое как «Пользователи», поэтому вы можете просто сделать что-то вроде «var langInfo = context.Languages.Select (e => new {Language = e , Count = e.Users.Count}). ToList(); ' – Hopeless

+0

Мне нужно подсчитывать и группировать только элементы, содержащиеся в моем исходном результате. Побережье, чтобы требовать только для подсчета, дорого. –

+1

Вам не нужно запрашивать всех пользователей, чтобы получить их счетчик, если вы хотите знать, как это сделать, попробуйте выполнить поиск в Google или найдите около *** явной загрузки ***. Конечно, прежде чем сделать так, «ленивая загрузка» должна быть временно отключена. Если у вас в настоящее время есть только несколько загруженных пользователей, то следуйте подходу нижеприведенного ответа (это что-то вроде этого). – Hopeless

ответ

2

Вы могли бы попробовать что-то вроде этого:

var results = data.SelectMany(user=>user.Languages) 
        .GroupBy(language=>language) 
        .Select(gr=>new { Language = gr.Key, Total = gr.Count()}); 

У меня есть должен, что каждый объект пользователь имеет последовательность строк, IEnumerable<string>, который называется языки и держит языки пользователя. Кроме того, данные, которые у вас есть, - это последовательность всех пользователей.

+0

Собственно говоря, Языки представляют собой набор языков (IEnumerable ). Во всяком случае, я думаю, я смогу адаптировать свой ответ. Я проверю это. Tks –

+0

Просто небольшая коррекция: ключ и граф от gr, а не от языка. Tks! Исправляя это, он работал как шарм. –

+0

@Douglas Gandini вы правы! Большое спасибо за то, что вы заметили это. Добро пожаловать. Я рад, что помог. – Christos