Вложенная группировка с Linq? - PullRequest
0 голосов
/ 27 ноября 2010

Я пытаюсь создать «простое» приложение расписания, которое почти выполняет то, что мне нужно, я не уверен, что это самый эффективный способ сделать это, поэтому, пожалуйста, сообщите мне, если у вас есть лучшие идеи... Я получил помощь здесь в SO ранее (см. Группировка элементов с помощью Linq и отображение в таблице в виде MVC , где вы также можете увидеть схему базы данных).Теперь мне просто нужно иметь возможность группировать на еще одном вложенном уровне.

Теперь я получаю вид таблицы, который выглядит примерно так:

Задача проекта 1 2 3 (датыс часами в ячейках)

ProjA-анализ 8 8 8

ProjB-анализ 8 7 8

(Etc)

Вот свойство в модели представления, котораяЯ использую для заполнения таблицы:

    public IEnumerable<IGrouping<Project, TimeSegment>> TimeSegmentsByProject
    {
        get
        {

            var projectGroups = from timeSegment in ts.TimeSegments
                                group timeSegment by timeSegment.Project
                                    into projectGroup
                                    select projectGroup;

            return projectGroups.ToList();
        }
    }

А вот код в представлении:

<table>
        <tr>
            <th>
                Projekt
            </th>
            <th>
                Aktivitet
            </th>
            <th>
                Timmar
            </th>
        </tr>
        <% foreach (var item in Model.TimeSegmentsByProject)
           { %>
        <tr>
            <td>
                <%:item.Key.Name %>
            </td>
            <td>
                <table>
                    <% foreach (var i in item)
                       { %>
                    <tr>
                        <td>
                            <%: i.Task.Name %>
                        </td>
                    </tr>
                    <% } %>
                </table>
            </td>
            <td>
                <table>
                    <% foreach (var i in item)
                       { %>
                    <tr>
                        <% for (int index = 0; index < 30; index++)
                           {%>
                        <td width="20px">
                            <%if (i.Date.Substring(8) == index.ToString())
                              { %>
                            <%: i.Hours %>
                            <% } %>
                        </td>
                        <% } %>
                    </tr>
                    <% } %>
                </table>
            </td>
        </tr>
        <% } %>
    </table>

Теперь проблема в том, что это работает нормально, но даже несмотря на то, что Projectгруппируется и появляется только один раз для каждого проекта, задача повторяется с новой строкой для того же имени задачи.Я хочу каждую задачу только один раз, как и для проекта.Но выражения группы linq и все, что меня уже запутало, так что я понятия не имею, как это сделать.Я немного над головой, я думал, что приложение с расписанием не будет такой сложной задачей (по крайней мере, основной).Но я довольно близок к тому, что можно было бы сделать, если бы я мог просто заставить эту группу задач работать, чтобы я не повторял это.

Буду признателен за любые советы о том, как изменить мой код для этого!(И если вы думаете, что я делаю это неправильно, скажите, пожалуйста, как)

1 Ответ

0 голосов
/ 27 ноября 2010

Вот удар.

var projectGroups =
  from timeSegment in ts.TimeSegments 
  group timeSegment by new   //start off by grouping two properties
  {
    ProjectName = timeSegment.Project.Name,
    TaskName = timeSegment.Task.Name
  } into g
  select new
  {
    Key = g.Key,
    Values =  //and finish off by turning each group into another query.
    (
      from ts in g
      group ts by ts.Date.Substring(8)) into g2
      select new {
        indexValue = g2.Key,
        Hours = g2.Sum(ts2 => ts2.Hours)
      }
    ).ToList()
  };

Теперь, если я использовал здесь анонимные типы, это не значит, что вам это нужно.Вы можете объявить фактические классы и использовать их для проецирования в.Просто будьте осторожны с классом, который служит ключом группировки (он имеет ProjectName и TaskName), так как вы не хотите использовать равенство ссылок ...

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