LINQ to SQL группировка и передача в представление - PullRequest
0 голосов
/ 09 февраля 2012

Я новичок в Asp.Net, MVC3, Linq и всем остальном, что с этим связано.Я очень привык к PHP и ColdFusion, так что простите мое невежество!По сути, я пытаюсь воссоздать ситуацию в ColdFusion, где я могу выполнить эквивалент группового атрибута cfoutput.Я так привык просто вызывать хранимую процедуру и затем делать

<cfoutput group="id">

, а затем еще один внутренний cfoutput для любых столбцов, которые имеют нечеткие данные.Работает как шарм!Не так много в Asp.Net.

Я хотел бы остановиться на использовании моей хранимой процедуры, которая возвращает соединение из двух таблиц с отношением один ко многим.Для примера, скажем, у меня есть 3 столбца: полное имя, название и год выпуска.Год окончания - это столбец объединенной таблицы, поэтому мой результат хранимой процедуры выглядит следующим образом:

Джим Профессор 2005
Джим Профессор 2008
Джим Профессор 2011

Iотправляю это в View.Я предполагаю, что это - работа Представления, чтобы тогда сгруппировать данные, основанные на одном из столбцов (вероятно полное имя).Я хочу вывести таблицу HTML с 3 столбцами, и в этой ситуации у меня будет ОДНА строка:

Джим Профессор 2005, 2008, 2011

У меня есть множество примеров, которые используют эту вещь под названиемгрупповой ключ.Это, кажется, не помогает мне, потому что меня не интересует просто вывод одного значения «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 ]

0 голосов
/ 08 ноября 2012

Полагаю, я наконец-то узнал, как решить то, что искал. «Групповое объединение», кажется, легко решает мою проблему. Информация, которую я нашел на этой странице, решила это: http://geekswithblogs.net/WillSmith/archive/2008/05/28/linq-joins-and-groupings.aspx

0 голосов
/ 09 февраля 2012

Я не такой уж большой специалист по Linq и MVC, но столкнулся с вашей проблемой:

  1. Занимайтесь подготовкой данных в контроллере / модели, после того, как вас учили, что представление должно касаться только отображения вещей.
  2. Я бы использовал знания из этих тем для решения вашей конкретной проблемы:

    а) группировка по нескольким столбцам: Группировка по нескольким столбцам

    б) Конкатенация как агрегатная функция: Использование LINQ для объединения строк

    в) Использование агрегатов и группировка по нескольким столбцам Как написать LINQ-запрос, объединяющий группу и агрегаты?

Если у вас есть данные в модели представления, просто отобразите их.

...