警告: これは C# の dynamic キーワードの不適切な使用である可能性があり、おそらく厳密に型指定されたビュー モデルを使用する必要がありますが...
ビューに C# 4 動的型を渡すことで、厳密に型指定されたビュー モデルの作成を回避しようとしています。コントローラーにこれがあります:
public ActionResult Index()
{
var query =
from fr in db.ForecastRates
join c in db.Codes
on
new { Code = fr.RateCode, CodeType = "ForecastRate" }
equals
new { Code = c.CodeValue, CodeType = c.CodeType }
select new
{
RateCode = fr.RateCode,
RateCodeName = c.CodeName,
Year = fr.Year,
Rate = fr.Rate,
Comment = fr.Comment
};
// Create a list of dynamic objects to form the view model
// that has prettified rate code
var forecastRates = new List<dynamic>();
foreach (var fr in query)
{
dynamic f = new ExpandoObject();
f.RateCode = fr.RateCode;
f.RateCodeName = fr.RateCodeName;
f.Year = fr.Year;
f.Rate = fr.Rate;
f.Comment = fr.Comment;
forecastRates.Add(f);
}
return View(forecastRates);
}
...そしてこれは私の見解です(私はMVC 3のRazorビューエンジンを使用しています):
@inherits System.Web.Mvc.WebViewPage<IEnumerable<dynamic>>
...
<tbody>
@foreach (var item in Model) {
<tr>
<td>@item.RateCodeName</td>
<td>@item.Year</td>
<td>@item.Rate</td>
<td>@item.Comment</td>
</tr>
}
</tbody>
LINQ の結果を繰り返し処理して動的オブジェクトのリストを作成する方法が気に入りません。
LINQ クエリ内で各 ExpandoObject を初期化したいのですが、サポートされていないようです。
クエリ結果をリストとしてキャストしようとしましたが、匿名型を動的に変換できないため、うまくいきませんでした。