Динамический запрос сводной таблицы LinqToSQL - PullRequest
0 голосов
/ 12 июня 2009

http://img7.imageshack.us/img7/3050/downtime.png

У меня есть два календаря (для и от), мне нужно построить год1 -> 4 динамически. Я также получаю дубликаты записей для 1 предметов, которые имеют значения за 2006 и 2009 годы. Они могут выбрать 100 лет, если они тоже этого хотят. Проверьте прикрепленное изображение.

  public ActionResult DownTimeSummaryTabular(int Start,int End)
    {
        var q = from item in new iSppms.Models.iSppmsDataContext().Incidents
                group item by new
                {
                    item.Supplier.Id,
                    item.Supplier.Name,
                    item.SupplierPlant,item.DownTime
                }
                    into supplier
                    select new
                    {
                        SupplierId = supplier.Key.Id,
                        SupplierName = supplier.Key.Name,
                        SupplierPlant = supplier.Key.SupplierPlant.Plant,
                        Years = from incident in supplier
                                let year = incident.IncidentDate.Year
                                where year <= End and year >= Start
                                group incident by year into incidentForYear
                                select incidentForYear.DownTime
                    };

        return View();
    }

1 Ответ

0 голосов
/ 12 июня 2009

Мой глаз! Хотел бы я иметь возможность редактировать.

Вот мое решение проблемы:

// This should be in your controller
var q = from item in new iSppms.DataAccess.IncidentRepository()
        group item by new { 
            item.Supplier.Id, 
            item.Supplier.Name, 
            item.Supplier.Plant } 
        into supplier 
        select new {
          SupplierId = supplier.Key.Id,
          SupplierName = supplier.Key.Name,
          SupplierPlant = supplier.Key.Plant,
          Years = from incident in supplier
                  let year = incident.IncidentDate.Year
                  where year <= EndYear and year >= StartYear
                  group incident by year into incidentForYear
                  select incidentForYear.DownTime.ToIntOrDefault()
        }

<%        
 foreach (var row in q)
 { %>
            <tr>
                <td>
                    <%= incident.SupplierName %>
                </td>
                <td>
                    <%= incident.SupplierPlant %>
                </td>
  <% for(var y = StartYear; y < EndYear; ++y) 
     { 
        var year = row.Years[y]; %>                
                <td>
                    <%= year.Sum() %>
                </td>
<% } %>                
            </tr>
 <% } %>

И это метод расширения, чтобы сделать преобразование более приятным.

 public static int ToIntOrDefault(this string value)
 {
  int result;
  Int32.TryParse(value, out result);
  return result;
 }

Обратите внимание, что в вашем представлении слишком много кода. Работа по выбору того, что будет отображаться, должна выполняться в вашем контроллере, включая преобразование в целые числа. Представление должно просто слепо перебирать коллекции (можно утверждать, что Sum () также должна выполняться в контроллере).

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