2016-12-06 2 views
1

Ich versuche, eine Hauptliste von Kunden mit einer anderen Liste von Kunden zusammenzuführen. Für jeden Kunden möchte ich Werte aus der Haupteingabeliste behalten, wenn der Wert bereits vorhanden ist (nicht Null), andernfalls ersetze er ihn durch den entsprechenden Wert aus der anderen Liste.Zwei Entitäten zusammenführen und Nullwerte in LINQ entfernen?

Etwas wie folgt aus:

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(); 

Das erwartete Ergebnis in der vereinigten Liste so sein würde:

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

Jetzt ist mein Punkt ist, ich habe mehr als 50 Objekte in meiner Einheit. Gibt es einen einfacheren Weg, die Zusammenführung durchzuführen, als alle 50 Bedingungen in meiner select Klausel manuell zu codieren?

+0

Sie können zumindest verkürzen sie 'Card_ID = a.Card_Id ?? b.Card_Id'. – juharr

Antwort

2

Sie könnten eine Reflexion basierte Hilfsmethode erstellen, um die Eigenschaften eines Paares wie Objekte zu verschmelzen:

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; 
} 

Dann kommen nur die Listen der Hilfsmethode mit der Zusammenführung auf jedem Paar zu tun:

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

Fiddle: https://dotnetfiddle.net/PlwXd3

Verwandte Themen