2016-12-06 7 views
1

私は顧客のマスターリストを別の顧客リストとマージしようとしています。顧客ごとに、値がすでに存在する場合(nullでない場合)、マスター入力リストから値を保持したい場合は、それを他のリストの対応する値に置き換えます。このような2つのエンティティをマージし、LINQでヌル値を削除しますか?

何か:

public class Customer 
{ 
    public int ID { get; set; } 

    public string Card_ID { get; set; } 

    public decimal? Cash { get; set; } 
} 


var masterlist = new List<Customer>() 
{ 
    new Customer() { ID = 1, Cash = 25 }, 
    new Customer() { ID = 2, Card_ID = "card2" } 
}; 

var existinglist = new List<Customer>() 
{ 
    new Customer() { ID = 1, Card_ID = "card1" }, 
    new Customer() { ID = 2, Card_ID = "card12222222222", Cash = 27 } 
}; 

var mergedlist = (from a in masterlist 
        from b in existinglist 
        where a.ID == b.ID 
        select new 
        { 
         ID = a.ID, 
         Card_ID = (a.Card_ID == null ? b.Card_ID : a.Card_ID), 
         Cash = a.Cash.HasValue ? a.Cash : b.Cash 
        }).ToList(); 

マージされたリストで、予想される結果は次のようになります:

{ ID = 1, Card_ID = "card1", Cash = 25 } 
{ ID = 2, Card_ID = "card2", Cash = 27 } 

今、私のポイントは、私は私のエンティティで50の以上の性質を持っている、です。私のselect句で50個の条件文をすべて手作業でコーディングするよりも簡単にマージを行う方法はありますか?

+0

あなたは、少なくともそれは 'Card_ID = a.Card_Idに短縮できますか? b.Card_Id'。 – juharr

答えて

2

あなたが好きなオブジェクトのペアのプロパティをマージするリフレクションベースのヘルパーメソッドを作成することができます。

public static T Merge<T>(T master, T other) where T : new() 
{ 
    var properties = typeof(T).GetProperties() 
     .Where(p => p.CanRead && p.CanWrite && !p.GetIndexParameters().Any()); 

    T result = new T(); 

    foreach (var prop in properties) 
    { 
     object value = prop.GetValue(master) ?? prop.GetValue(other); 
     prop.SetValue(result, value); 
    } 

    return result; 
} 

すると、ちょうど各ペアにマージを行うためにヘルパーメソッドを使用してリストに参加:

var mergedlist = from a in masterlist 
       join b in existinglist 
       on a.ID equals b.ID 
       select Merge(a, b); 

フィドル:https://dotnetfiddle.net/PlwXd3

関連する問題