2

MVC プロジェクトに集計データ ビューがあり、監査ステータスごとに月ごとの合計が表示されます。コントローラー コードは、次のような匿名オブジェクトへの単純な LINQ プロジェクションを使用してこれを設定します。

From audits In db.Audits
Group By key = audits.DateCreated.Value.Month Into g = Group
Select New With {
    .Month = key,
    .Assigned = g.Sum(AuditsWithStatus(AuditStatus.Issued)),
    .Unassigned = g.Sum(AuditsWithStatus(AuditStatus.Pending)),
    .Closed = g.Sum(AuditsWithStatus(AuditStatus.Closed)),
    .Cancelled = g.Sum(AuditsWithStatus(AuditStatus.Cancelled))
}

これが LINQ (匿名型の使用) の大きな利点の 1 つであることはわかっていますが、ビューで厳密な型指定 (つまり、@ModelType SomeStrongType) が失われるのは好きではありません。これに関する一般的なアドバイスはありますか?問題を扱う記事、ブログ、またはその他の場所と、いつ使用するか?

4

2 に答える 2

3

メソッドのスコープ外で匿名型を使用することはできません。たとえば、それらをビューに戻すことはできません。そのような場合、既知のタイプを使用する必要があります。

別の方法で処理しているデータを選択するときは、匿名型を使用します。たとえば、Linq を使用して 1 つのソースから特注のデータを選択し、別のソースに配置します。

IEnumerable<IGrouping<TKey, TValue>>TKeyなどの集約データを返す場合TValueは匿名型です (必要に応じて匿名型でグループ化できます)。TKeyとの 2 つのクラスを作成したくない場合TValueTKey、 がオーバーライドされているためEqualsGetHashCodeそれでグループ化できます。そして、そこからいくつかの値を読み取って破棄し、再利用しないようにするだけです。

TLDR; 結果を格納するために既知の型を作成する必要がない場合に使用します。結果をメソッドのスコープ外のどこかに渡す必要がある場合は、型が必要になります。

于 2012-07-24T12:50:11.230 に答える
0

一般的なアドバイスは簡単です。常にビュー専用のビューモデル タイプを作成してください。あなたの場合、匿名クラスにあるプロパティを正確に含む、非常に単純なものになります。

不必要なオーバーヘッドのように思えることは理解していますが、コードが読みやすく、検証しやすくなります。

于 2012-07-24T14:14:15.963 に答える