2016-12-28 24 views
4

私は2つのテーブル、例えばT1T2を持っています。 T1は、oID、cID、日付、ステータスおよびT2に、cID、cName、cURLが含まれています。 foreign keyT2 - cID2テーブルのレコードを1つのIEnumerableビューモデルに結合するためのAutoMapper

を参照している

T1.csT1

public class T1{ 
    public int oID{get;set;} 
    public int cID{get;set;} 
    public DateTime date{get;set;} 
    public string status{get;set;} 
} 

T2.cs

public class T2{ 
    public int cID{get;set;} 
    public string cName{get;set;} 
    public string cURL{get;set;} 

} 

cID:私は以下のように2つのテーブル上のクラスを設計しました

N OW私はT1T2

T3.cs

public class T3:T1 
{ 
    public int cID{get;set;} 
    public string cName{get;set;} 
    public string cURL{get;set;} 
} 

T3を組み合わせるために、以下のように私のT3ビューモデルを持っているT1T2プロパティがT3で定義されている拡張。したがって、私はAutoMapperを使って1つのビューモデルで2つのテーブルを結合しようとしていました。私は以下の方法でT1と詳細をT2から得ることができます。充填するとIEnumerable T3が返ってきます。

public IEnumerable<T3> GetAll() 
{ 
    var od = mycontext.t1repository.GetMany().ToList(); 
    var ck = myContext.t2repository.GetMany(x => od.All(y => y.cID == x.cID)).ToList(); 
    if (od.Any()) 
    { 
     Mapper.CreateMap<tblT1, T3>(); 
     Mapper.CreateMap<tblT2, T3>() 
        .ForMember(x=>x.cID, a => a.MapFrom(s => s.cID)) 
     var response = Mapper.Map<List<T1>, List<T3>>(od); 
     return response; 
    } 
    return null; 
} 

Iはthis answerを介して上記のコードを試みたが、それは、単一インスタンスのためであり、Iは、レコードのIEnumerableを返却しなければなりません。私は実際にどのように彼らのcIDに基づいて2つのテーブルからデータをマップすることができますか分からない。どのように私はこれを達成することができますか?

+0

T3の親(T1)のフィールドを使用する必要がありますか? – Marusyk

+0

@MegaTronはい私は..私は 'T1'のデータと' T2'の関連データを表示し、 'T3'にそれらをマージする必要があります –

答えて

2

私はあなたがこのような何か試すことができると思います。その後に、マップT1を作成

public class T3:T1 
{ 
    public int cID{get;set;} //need to remove 
    public string cName{get;set;} 
    public string cURL{get;set;} 
} 

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<T1, T3>(); 
    cfg.CreateMap<T2, T3>(); 
}); 

var mapper = config.CreateMapper(); 

var od = new List<T1> { ... }; 
var ck = new List<T2> { ... }; 

var result = od.Join(ck, t => t.cID, t => t.cID, (t1, t2) => 
{ 
    var t3 = mapper.Map<T1, T3>(t1); 
    t3 = mapper.Map<T2, T3>(t2, t3); 

    return t3; 
}); 
+1

それはまさに私が探していたものです:) :)ありがとう.. :) –

+1

@GuruprasadRao:どうぞよろしくお願いいたします。 –

+1

** Automapper v4.0.4 **を使用しているので、 'var config = new MapperConfiguration'の代わりに' Mapper.Initialize'を実行しなければならないので、追加する必要があります。 –

1

まずそれが基底クラスT1から継承されますので、あなたはここにcIDを必要としないがT3:

Mapper.CreateMap<T1, T3>() 
    .ForMember(dest => dest.cName, opt => opt.Ignore()) 
    .ForMember(dest => dest.cURL, opt => opt.Ignore()); 

その後、T2tのマップを作成しますo T3:

Mapper.CreateMap<T2>, T3>() 
    .ForMember(dest => dest.oID, opt => opt.Ignore()) 
    .ForMember(dest => dest.date, opt => opt.Ignore()) 
    .ForMember(dest => dest.status, opt => opt.Ignore()); 
+0

あなたの時間のおかげでありがとう..私は上記の答えに行ってみたい::)良いアプローチ彼は.. +1 .. :) –

関連する問題