LINQ to SQL группировка и передача в представление
Я новичок в Asp.Net, MVC3, Linq, и все остальное, что связано с этим. Я очень привык к PHP и ColdFusion, так что простите мое невежество! По сути, я пытаюсь воссоздать ситуацию в ColdFusion, где я могу выполнить эквивалент группового атрибута cfoutput. Я так привык просто вызывать хранимую процедуру, а затем делать
<cfoutput group="id">
и затем другой внутренний cfoutput для любых столбцов, которые имеют нечеткие данные. Работает как шарм! Не так много в Asp.Net.
Я хотел бы остановиться на использовании моей хранимой процедуры, которая возвращает соединение из двух таблиц с отношением один ко многим. Для примера, скажем, у меня есть 3 столбца: полное имя, название и год выпуска. Год окончания - это столбец из объединенной таблицы, поэтому мой результат хранимой процедуры выглядит следующим образом:
Джим Профессор 2005
Джим Профессор 2008
Джим Профессор 2011
Я отправляю это в View. Я предполагаю, что это - работа Представления, чтобы тогда сгруппировать данные, основанные на одном из столбцов (вероятно полное имя). Я хочу вывести таблицу HTML с 3 столбцами, и в этой ситуации у меня будет ОДНА строка:
Джим Профессор 2005, 2008, 2011
Я набрал в Google множество примеров, использующих то, что называется групповым ключом. Это, кажется, не помогает мне, потому что меня не интересует просто вывод одного значения "Jim" (или любого другого сгруппированного значения), мне нужно, чтобы значения "Jim" и "Professor" выводились для каждой строки. Я думаю, что мне понадобятся 2 цикла foreach, внешний цикл отображает полное имя и заголовок, а внутренний цикл проходит через все возможные совпадения за годы выпуска. Я не могу получить годы выпуска в группе, особенно с этим синтаксисом IGrouping. Ключ может хранить только одно значение, и мне нужно каждое значение в этой строке, мне действительно нужно только одно или два значения для итерации. Должен ли я попытаться создать пользовательскую модель представления после выполнения вторичной группировки linq, а затем отправить ее в строго типизированное представление?
РЕДАКТИРОВАТЬ: Хорошо, у меня есть код, который работает, но он кажется очень неэффективным, поскольку я в основном должен переопределить все столбцы / значения, которые я имею из моей хранимой процедуры. Это почти заставляет меня хотеть забыть хранимые процедуры и просто использовать LINQ для всего. Кажется, что я просил, это своего рода "группа по нескольким столбцам", и ссылка очень помогла.
var records = db.getRecords();
var groups = from r in records
group r by new
{
r.id
}
into row
select new ListVM()
{
id = row.Key.id,
fullname = row.Select(x => x.fullname).First(),
title = row.Select(x => x.title).First(),
degrees = row.Select(x => x.degree_name).ToList(),
majors = row.Select(x => x.major_name).ToList()
};
return View(groups);
Я, конечно, должен был создать ViewModel, чтобы это работало. На мой взгляд, я могу использовать циклы for для перебора списков степеней и специальностей. Это лучший способ сделать это? Мне просто нужно больше, чем просто групповой ключ, чтобы отобразить весь мой ряд информации, и я хочу только перебирать списки один или два раза в строке из 20 столбцов, в отличие от однократного отображения группового ключа и перебора всего в большинстве примеров. Понимаю.
2 ответа
Я верю, что наконец-то узнал, как решить то, что искал. "Групповое объединение", кажется, легко решает мою проблему. Информация, которую я нашел на этой странице, решила это: http://geekswithblogs.net/WillSmith/archive/2008/05/28/linq-joins-and-groupings.aspx
Я не такой уж большой специалист по Linq и MVC, но столкнулся с вашей проблемой:
- Занимайтесь подготовкой данных в контроллере / модели, после обучения этому представлению следует заниматься только отображением вещей.
Я бы использовал знания из этих тем для решения вашей конкретной проблемы:
а) группировка по нескольким столбцам: группировка по нескольким столбцам
б) Конкатенация как агрегатная функция: использование LINQ для конкатенации строк
c) Использование агрегатов и группировка по нескольким столбцам Как написать запрос LINQ, объединяющий группу по и агрегатам?
Если у вас есть данные в вашей модели представления, просто отобразите их.