Нужна помощь с запросом LINQ и ASP.NET MVC? - PullRequest
3 голосов
/ 24 июня 2009

Мой репозиторий возвращает список учетных записей.

У каждой учетной записи есть дата и десятичная сумма MoneySpent. Итак, у меня есть список учетных записей, и в моем контроллере я пытаюсь немного обработать этот список.

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

Вот что я пробовал:

    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Detail(int id)
    {
        var recentAccounts = accountRepository.GetAccountsSince(DateTime.Now.AddMonths(-6));

        var monthlyTotals = from a in recentAccounts
                           group a by a.DateAssigned.Month.ToString("MMM") into m
                           select new 
                           { 
                               Month = m.Key,
                               MonthSum = m.Sum(a => a.MoneySpent)
                           };


        return View();

    }

Похоже ли это на правильный способ рассчитать месячные итоги?

Кроме того, я использовал строго типизированные представления с ViewModels для каждого вида, так что какой тип я должен сделать ежемесячно, чтобы я мог добавить его в качестве поля в моей ViewModel и передать его в мой View?

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

Смотрит прямо на меня.

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

public class MonthlyTotal
{
    public string Month { get; set; }
    public decimal MonthSum { get; set; }
}

и ваше предложение SELECT будет выглядеть так:

select new MonthlyTotal                          
{                                
    Month = m.Key,                               
    MonthSum= m.Sum(a => a.AmountAssigned)
}                         
1 голос
/ 24 июня 2009

Использование анонимного типа не будет работать, так как код представления не будет знать, какими свойствами он обладает. Я предлагаю создать модель только для просмотра в каталоге Models.

public class MonthlySumModel
{
     public string Month { get; set; }
     public decimal Sum { get; set; }
}

Затем создайте новое значение модели в операторе выбора:

select new MonthlySumModel
          {
              Month = m.Key,
              Sum = m.Sum(a => a.MoneySpent)
          };

Затем вы можете использовать эту модель в качестве типа для представления.

1 голос
/ 24 июня 2009

Я бы, вероятно, разбил эту логику на класс уровня обслуживания, содержащий бизнес-логику. Наряду с этим, если представление ожидает структуру, отличную от модели, вы преобразуете свои результаты в свой метод обслуживания, возвращая пользовательский тип модели.

...