2016-03-27 14 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

を返すリストと一致するビューの変更モデル定義。コントローラが作成してビューに渡すナビゲーションプロパティのないデータを含むViewModelを作成する –

+0

アドバイスをいただきありがとうございます。私は最終的にこのアプローチに変わりますが、今私の目標は、アプリケーションを起動して実行することです。 SelectMany(c => c)は今のところ選択します – kunaguvarun

答えて

2

ビューに現在渡しているタイプは、指定されたタイプ

@model IEnumerable<HealthCheckIndex.Models.DashboardEntry> 

現在、あなたは鍵が適用され、値がHealthCheckIndex.Models.DashboardEntry

のIEnumerableをされた辞書のようなものを渡していると一致していません。それはあなたが2つのいずれかのオプションを持っているようにするために

  1. が持つコントローラのアクションの最後の行を置き換え

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

  2. あなたはそれがあなたのビューに直接EFモデルを渡すことではないのが最善です

+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