【问题标题】:Merge two entities and eliminate null values in LINQ?合并两个实体并消除 LINQ 中的空值?
【发布时间】:2016-12-06 22:46:39
【问题描述】:

我正在尝试将客户主列表与另一个客户列表合并。对于每个客户,如果值已经存在(非空),我想保留主输入列表中的值,否则将其替换为另一个列表中的相应值。

类似这样的:

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 个条件更简单的方法来进行合并?

【问题讨论】:

  • 您至少可以将其缩短为Card_ID = a.Card_Id ?? b.Card_Id

标签: c# .net linq join


【解决方案1】:

您可以创建一个基于反射的辅助方法来合并一对相似对象的属性:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2022-01-24
    相关资源
    最近更新 更多