2016-03-27 3 views
1

Нужна помощь в создании запроса LINQ для группировки и фильтрации со связанными объектами.LINQ EF Группировка и исключение исключения

Вот мои классы моделей.

public class Application 
    { 
     [DisplayName("Application")] 
     public int ApplicationId { get; set; } 
     [DisplayName("Application")] 
     public string Name { get; set; } 
     public List<DashboardEntry> DashboardEntries { get; set; } 
    } 

public class Cluster 
    { 
     [DisplayName("Cluster")] 
     public int ClusterId { get; set; } 
     [DisplayName("Cluster")] 
     public string Name { get; set; } 
    } 

[Bind(Exclude = "AlbumId")] 
    public class DashboardEntry 
    { 
     [ScaffoldColumn(false)] 
     public int DashboardEntryId { get; set; }   
     public int ClusterId { get; set; }   
     public int ApplicationId { get; set; }   
     public HealthStatusIndicator Status { get; set; } 
     public string Incident { get; set; } 
     public string Remarks { get; set; } 

     public virtual Cluster Cluster { get; set; } 
     public virtual Application Application { get; set; } 
    } 

Индексный метод действия заключается в следующем

public ActionResult Index() 
     { 
      //var dashboardEntries = db.DashboardEntries.Include(d => d.Application).Include(d => d.Cluster); 

      var dashboardEntries = db.DashboardEntries 
            .Include(d => d.Application) 
            .Include(d => d.Cluster)         
            .GroupBy(d => d.Application); 

      return View(dashboardEntries.ToList()); 
     } 

В представлении, модель декларации, как показано ниже.

@model IEnumerable<HealthCheckIndex.Models.DashboardEntry> 

Я получаю сообщение об ошибке

Модель элемент передается в словарь типа «System.Data.Entity.Infrastructure.DbQuery1 [System.Linq.IGrouping2 [HealthCheckIndex.Models .Application, HealthCheckIndex.Models.DashboardEntry]] ', , но для этого словаря требуется элемент модели типа ' System.Collections.Generic.IEnumerable`1 [HealthCheckIndex.Models.DashboardEntry] '.

Если я изменю декларацию модели, как показано ниже, я получаю еще одну ошибку, которую Cluster недоступен.

@model IEnumerable>

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

+4

Это лучше не передавать EF Модели непосредственно на View. Создайте ViewModel, который содержит данные без свойств навигации, которые контроллер создает и передает на ваш вид. –

+0

Спасибо за совет. В конечном итоге я перейду на этот подход, но сейчас моя цель - запустить приложение и запустить его. Я собираюсь выбрать SelectMany (c => c) на данный момент – kunaguvarun

ответ

2

Тип, который вы передаете в настоящее время к представлению не соответствует заданному типу

@model IEnumerable<HealthCheckIndex.Models.DashboardEntry> 

В настоящее время вы передаете что-то вроде словаря, где ключ является применение и значение является IEnumerable из HealthCheckIndex.Models.DashboardEntry

для того, чтобы сделать это у вас есть один из 2 вариантов:

  1. Заменить последнюю строку действия контроллера с

    return View(dashboardEntries.SelectMany(c=> c).ToList());

  2. определение изменений модели в окне, чтобы соответствовать список вашего возвращения

+0

Спасибо за SelectMany (c => c). Он возвращает все записи, сгруппированные в приложения. Как фильтровать группы на основе максимального значения dashboardEntryId из каждой группы? – kunaguvarun

+0

Вместо SelectMany просто используйте «Select (c => c.Max (x => x.DashboardEntryId))» –

+0

Спасибо. Я наткнулся на этот http://stackoverflow.com/questions/470440/how-to-select-only-the-records-with-the-highest-date-in-linq, который также, похоже, решает проблему – kunaguvarun

Смежные вопросы