9

この件に関する投稿がたくさんあることは知っていますが、自分がやりたいことをするのに役立つ投稿が見つかりません。最終的に Automapper を使用することはわかっていますが、実際に使用する前に、手動で行う方法を学びたいと考えています。ViewModel を作成し、リポジトリを介してエンティティからの値を入力し、View に送信したいと考えています。これは簡単なことのように聞こえますが、私はそれを成し遂げるのに苦労しています。MVC 3、EF 4.3、データベース ファーストを使用しています。クラスを自動生成しました。関連するエンティティ(この投稿では省略/名前変更)とクラスを投稿しています。これまでのところ、次のとおりです。

集約エンティティ: 出荷ヘッダー

using System;
using System.Collections.Generic;

namespace My.Models
{
public partial class ShippingHdr
{
    public ShippingHdr()
    {
        this.ShippingLI = new HashSet<ShippingLI>();
    }

    public int ID { get; set; }
    public int ShipToSiteID { get; set; }
    public Nullable<System.DateTime> DateShipped { get; set; }
    public Nullable<System.DateTime> EstDeliveryDate { get; set; }
    public string FromSitePOC { get; set; }
    public Nullable<int> ShipperID { get; set; }
    public string TrackingNo { get; set; }
    public string Comments { get; set;}
    public virtual Shippers Shippers { get; set; }
    public virtual ICollection<ShippingLI> ShippingLI { get; set; }
}

}

これが私のViewModelです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace My.Models.ViewModels
{

public class ShippingHeaderSummaryVM
{
    public int ID { get; set; }
    public string Site { get; set; }
    public Nullable<System.DateTime> DateShipped { get; set; }
    public Nullable<System.DateTime> EstDeliveryDate { get; set; }
    public string TrackingNo { get; set; }
    public string HeaderComments { get; set; }
    public string Shipper { get; set; }
    public int NumOrders { get; set; }
    public string Site { get; set; }


}

}

これは、ビューモデルに入力するために使用したいアイテムを返すクエリです。これに最適な場所はリポジトリにあると思います。LinqPad を使用して必要なデータが返されることを確認しました (したがって、dbContxt への参照がありません)。クエリから ViewModel に値を取得する方法がわかりません。

var shipments = from h in c.ShippingHdrs
                        where (h.ShippingLI.Count > 1)
                        join
                        e in c.vHr_Employees on h.CreatedBy equals e.ID
                        join
                        s in c.Shippers on h.ShipperID equals s.ShipperID
                        join
                        r in vAaiomsSites on h.ShipToSiteID equals r.SiteID

                        select new
                        {
                            h.ID,
                            r.Site,
                            h.EstDeliveryDate,
                            h.DateShipped,
                            h.TrackingNumber,
                            h.HeaderComments,
                            e.LastName,
                            h.ShippingLI.Count,
                            s.Shipper
                                                        };

そこで、ここでも Automapper を使用せずに、ViewModel に ShippingHdr エンティティのすべての行を入力し、それをビューに渡します。

マップする必要があるフィールドは次のとおりです。

出荷からマッピングされた ShippingHeaderSummaryVM

ID = h.ID
Site = r.Site
DateShipped = h.DateShipped
EstDeliveryDate = h.EstDeliveryDate
TrackingNo = h.TrackingNumber
FromSitePOC = e.LastName
NumOrders = h.ShippingLI.Count
Shipper = s.Shipper
HeaderComments = h.HeaderComments

私はここで立ち往生しています。クエリから ViewModel を作成するにはどうすればよいですか? 次に、コントローラーからそのアクションを呼び出すにはどうすればよいですか?

十分な情報を提供できたことを願っています。

4

2 に答える 2

5

ビューモデルオブジェクトに基づいて出荷のリストを作成するには、データベースの出荷のコレクションからビューモデルに基づいた出荷のコレクションにマッピングするマッピングメソッドを作成する必要があります。

var model = new List<ShippingHeaderSummaryVM>();

foreach(var h in shipments)
{

    var viewModel = new ShippingHeaderSummaryVM
    {
    ID = h.ID
    Site = r.Site
    DateShipped = h.DateShipped
    EstDeliveryDate = h.EstDeliveryDate
    TrackingNo = h.TrackingNumber
    FromSitePOC = e.LastName
    NumOrders = h.ShippingLI.Count
    Shipper = s.Shipper
    HeaderComments = h.HeaderComments
    }

    model.Add(viewModel);
}

return model;

ちなみに、AutoMapperを起動して実行すると、これは1つのライナーになります。

var model = Mapper.Map<IEnumerable<ShippingHdr>, IEnumerable<ShippingHeaderSummaryVM>>(shipments);

一方、手動で物事を行う方法を学ぶことは素晴らしいことです。モデルを手動でマッピングしても、実際にはどのような方法や形式でもメリットはありません。AutoMapperを使用します。

于 2012-06-05T23:19:11.220 に答える
1

Linq を使用して、このようなことを行うこともできます...

shipments.Select(h => new ShippingHeaderSummaryVM(){
    ID = h.ID,
    Site = r.Site,
    DateShipped = h.DateShipped,
    EstDeliveryDate = h.EstDeliveryDate,
    TrackingNo = h.TrackingNumber,
    FromSitePOC = e.LastName,
    NumOrders = h.ShippingLI.Count,
    Shipper = s.Shipper,
    HeaderComments = h.HeaderComments
});

ビュー モデルのマッピングはビューに渡すのに最適ですが、ビュー モデルから読み取ってデータベースを更新するときは常に手動で行うことに注意してください。

編集:タイプミスの修正をありがとう:-)

于 2012-06-05T23:54:18.797 に答える