C# LINQ:连接两个对象,在引用上合并

C# LINQ:连接两个对象,在引用上合并,c#,.net,linq,C#,.net,Linq,我有一个产品草案清单,需要与保存的数据库进行匹配,并进行一些计算。当我们检索或创建时,它们是相同的对象。如果我将Reference1草稿与Reference1 saved和Reference2草稿与Reference2saved进行匹配,效果会很好,但是他们更改了数据库表,并且还必须修改对象,其中,他们可以使用OverrideReference1字段覆盖Reference1值。OverrideReference1是高优先级的,如果不是空的,则在引用1上使用。我还使用了string.IsNullO

我有一个产品草案清单,需要与保存的数据库进行匹配,并进行一些计算。当我们检索或创建时,它们是相同的对象。如果我将Reference1草稿与Reference1 saved和Reference2草稿与Reference2saved进行匹配,效果会很好,但是他们更改了数据库表,并且还必须修改对象,其中,他们可以使用OverrideReference1字段覆盖Reference1值。OverrideReference1是高优先级的,如果不是空的,则在引用1上使用。我还使用了string.IsNullOrEmptys.OverrideReference1?s、 参考1:s.在加入时覆盖参考1,但没有运气

我使用下面的代码来查询结果,但在连接两个对象时出错

        var draft = new List<Product>
        {
            new Product { ProductName ="Phone", Quantity = 1000, Reference1 = "RC1", OverrideReference1 = string.Empty, Status = "Draft", Reference2 = string.Empty },
            new Product { ProductName ="Phone", Quantity = 2000, Reference1 = "RC2", OverrideReference1 = string.Empty, Status = "Draft", Reference2 = string.Empty  },
            new Product { ProductName ="Phone", Quantity = 3000, Reference1 = "RC3", OverrideReference1 = string.Empty, Status = "Draft", Reference2 = string.Empty  },
            new Product { ProductName ="Phone", Quantity = 3000, Reference1 = string.Empty, OverrideReference1 = string.Empty, Status = "Draft", Reference2 = "CC1"  },
        };

        var saved = new List<Product>
        {
            new Product { ProductName ="Phone", Quantity = 500, Reference1 = "RC1", OverrideReference1 = "RC3", Status = "Saved" },
            new Product { ProductName ="Phone", Quantity = 3000, Reference1 = string.Empty, OverrideReference1 = string.Empty, Status = "Saved", Reference2 = "CC1"  },
        };

        var results = (from d in draft
                       join s in saved on new { d.Reference1, d.Reference2 } equals new { s.OverrideReference1 ?? s.Reference1, s.Reference2 }
                       select new Product
                       {
                           ProductName = d.ProductName,
                           Quantity = s.Quantity - d.Quantity,
                           Reference1 = d.Reference1,
                           Status = d.Status
                       }).ToList();

列名必须设置为相同。当字符串为空时,您的问题将覆盖此属性引用1

这方面的问题:

    join s in saved on new { d.Reference1, d.Reference2 } equals 
new { s.OverrideReference1 ?? s.Reference1, s.Reference2 }
更新

join s in saved on new {
                        (string?)Reference1 = d.Reference1,
                        (string?)Reference2= d.Reference2 } equals 
                    new {(string?)Reference1 = s.OverrideReference1 ?? s.Reference1,
                         (string?)Reference2= s.Reference2 }
代码:

var results = (from d in draft
                   join s in saved on new {(string?)Reference1 = d.Reference1,(string?)Reference2= d.Reference2 } equals 
                   new {(string?)Reference1 = s.OverrideReference1 ?? s.Reference1,(string?)Reference2= s.Reference2 }
                   select new Product
                   {
                       ProductName = d.ProductName,
                       Quantity = s.Quantity - d.Quantity,
                       Reference1 = d.Reference1,
                       Status = d.Status
                   }).ToList();