2

私はこのようなモデルを持っています

public class Exam
{
    public int NewsId { get; set; }
    public string Title { get; set; }
    public string Description{ get; set; }
    public string Program{ get; set; }
 }

そしてこのようなビューモデル

public class ExamViewModel
{
    public int NewsId { get; set; }
    public string Title { get; set; }
}

そして私はこのようにAutomapperを設定します

AutoMapper.Mapper.CreateMap<Exam, ExamViewModel>();

ActionResultでは、次のようにAutomapperを使用しました。

    public ActionResult Exam()
    {
        var examsDb = db.Exams;
        IEnumerable<ExamViewModel> examViewModel = AutoMapper.Mapper.Map<IEnumerable<Exam>, IEnumerable<ExamViewModel>>(examsDb);

        return View(examViewModel);
    }

そしてビューで私はそれをループします

     @model IEnumerable<AraParsESOL.ViewModels.ExamViewModel>
       <ul>
      @foreach (var e in Model)
        { 
           <li>
              @Html.ActionLink(e.Title, "Type", "Exam")
            </li>
          }
      </ul>

私の問題は次のとおりです。モデルでわかるように、4つのプロパティがありますが、viewModelでは2つのプロパティしかありません。

モデル全体ではなく、viewModelでこれら2つのプロパティのみを取得するにはどうすればよいですか?

ここで何が起こるかというと、各ループの後にビューでデータベースから必要な列を取得しますが、これら2つのプロパティのみが必要であり、データベースには戻りません。

このdb.Exam.ToList();のようなデータベースを取得できます。ただし、データベース全体が元に戻ります。ここでベストプラクティスを使用したいですか?

私はanonymouseタイプとselectコマンドでデータベースからデータを取得できることを知っていますが、automapperの使用は何ですか?ここでの最良の解決策は何ですか?

4

1 に答える 1

2

AutoMapperは使用しないでください。には適していませんIQueryable<T>。代わりに、LINQプロジェクションを使用してください。

public ActionResult Exam()
{
    var examsDb = db.Exams;
    IEnumerable<ExamViewModel> examViewModel = 
        from e in db.Exams
        select new ExamViewModel
        {
            NewsId = e.NewsId,
            Title = e.Title
        };

    return View(examViewModel);
}

生成されたSQLを見ると、列NewsIdTitle列のみが返されていることがわかります。AutoMapperの人々はこの欠点に対処することに興味を持っていたようですが、それ以来、私はそれについて何も聞いていません。

于 2012-07-12T13:20:41.620 に答える