Обход вложенного LINQ-запроса анонимных объектов в представлении C # через ASP.NET MVC - PullRequest
0 голосов
/ 27 января 2010

Обход вложенного LINQ-запроса анонимных объектов в представлении C # через ASP.NET MVC

Привет, много занимался поиском и чтением, но все же требуется определенная информация. У меня есть следующий код:

       List<DateTime> range = getRangeCollection();

        var range = (
             from years in rangeData 
             group years by years.Year 
             into yearsData 
             select new {
                 year = yearsData.Key,
                 months = (
                     from month in yearsData 
                     group month by month.Month 
                     into monthsData
                     select new {
                         month = monthsData.Key,
                         days = (
                             from days in monthsData
                             group days by days.Day
                             into daysData
                             select new {
                                 day = monthsData.Key, 
                                 days = daysData
                             })
                     })
             }).ToList();

Я могу отправить это как свойство ViewData для представления, подобного этому.

    <% foreach (var date in ((IEnumerable)ViewData["range"])) { 
// another foreach needed to access date.month and loop days inside.
 %> 
 <p><%=date%></p>
  <% } %>

Но я хочу использовать его для генерации HTML, который выглядит следующим образом:

2009
  January
    (all the days in jan)
  February
    (all the days in feb)
    ..ect
2010
  Janurary
    (all the days in jan)
  February
    ...ect

Я не уверен, что мой LINQ правильный, но я пытаюсь просмотреть результаты в среде ASP.NET MVC. Я пытаюсь разобраться в IEnumerable и IQueryable. Я на правильном пути?

Ответы [ 2 ]

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

Я думаю, что вы, возможно, слишком усложняете решение, основываясь на том, что я думаю, вы пытаетесь сделать. В конечном итоге было бы здорово написать небольшой класс для обработки такого типа структуры данных, в котором вы хотите агрегировать даты на основе года и месяца.

Я предполагаю, что вы хотите оставить пустые годы / месяцы или что в вашем диапазоне дат вряд ли будут пробелы. Вы также заметите, что я использую IQueryable, а не IEnumerable.

В основном вам нужно различать годы в вашем диапазоне, а затем различать месяцы в каждом из этих лет. Итак, учитывая этот набор данных:

List<DateTime> dateRange = new List<DateTime>();
dateRange.Add(new DateTime(2009, 5, 18));
dateRange.Add(new DateTime(2009, 5, 12));
dateRange.Add(new DateTime(2009, 6, 22));
dateRange.Add(new DateTime(2009, 2, 14));
dateRange.Add(new DateTime(2009, 11, 23));
dateRange.Add(new DateTime(2010, 5, 2));
dateRange.Add(new DateTime(2010, 7, 17));
dateRange.Add(new DateTime(2010, 7, 10));
dateRange.Add(new DateTime(2009, 11, 28));
dateRange.Add(new DateTime(2009, 11, 16));
dateRange.Add(new DateTime(2010, 1, 30));
dateRange.Add(new DateTime(2010, 3, 1));
dateRange.Add(new DateTime(2010, 9, 23));
dateRange.Add(new DateTime(2010, 5, 1));
dateRange.Add(new DateTime(2010, 9, 4));
ViewData["range"] = dateRange.AsQueryable();

Вы можете выполнить итерацию по вашему мнению, выполнив:

<% var range = ViewData["range"] as IQueryable<DateTime>; %>
<% foreach (var year in range.Select(x=>x.Year)
   .Distinct()
   .OrderBy(x=>x))
{ %>

<ul>
    <li><%=year %>
    <ul>
<% foreach (var month in range.Where(x=>x.Year==year)
   .OrderBy(x=>x.Month)
   .Select(x=>x.Month)
   .Distinct()) { %>
        <li><%=(new DateTime(1900,month,1)).ToString("MMMM") %>
        <ul>
<% foreach (var day in range.Where(x => x.Year == year && x.Month == month))
{ %>
            <li>
            <%=day.ToLongDateString() %>
            </li>
<% } %>
        </ul>
        </li>
<% } %>
    </ul>
    </li>
</ul>

В идеале вы просто хотите использовать методы расширения или класс-обертку, чтобы вы могли сделать:

foreach(var year in range.DistinctYears())

Месяцы, которые оборачивают английский формат вокруг целочисленного значения, тоже были бы хорошими.

Посмотрите, как это работает для вас.

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

Не могли бы вы просто заказать () этот список по году, месяцу, дню? Я что-то упустил?

range.OrderBy(r => r.Year).OrderBy(r => r.Month)...
...