根据列结合两个列表

我正在使用Linq到Sql的两个列表的联合。 使用List1和List2:

var tr = List1.Union(List2).ToList(); 

联盟工作正常,但问题是检查每一列并删除我想要的一些行。 所以我想知道是否有一种方法可以执行基于一列的联合,比如说每个列表的id

就像是:

 var t = List1.id.Union(List2.id).ToList(); 

这不起作用,但我想知道是否有办法用LINQ或T-SQL做到这一点

您应该使用此Union ()重载(使用自定义相等比较器),或类似的东西:

 list1.Concat(list2).GroupBy(x => x.DateProperty).Select(m => m.First()); 

第一种解决方案当然更有效。

当然,你需要一个自定义IEqualityComparerUnion 。 我有一个非常动态,大块代码传入但是:

 public class PropertyEqualityComparer : IEqualityComparer { Func _selector; IEqualityComparer _internalComparer; public PropertyEqualityComparer(Func propertySelector, IEqualityComparer innerEqualityComparer = null) { _selector = propertySelector; _internalComparer = innerEqualityComparer; } public int GetHashCode(TObject obj) { return _selector(obj).GetHashCode(); } public bool Equals(TObject x, TObject y) { IEqualityComparer comparer = _internalComparer ?? EqualityComparer.Default; return comparer.Equals(_selector(x), _selector(y)); } } public static class PropertyEqualityComparer { public static PropertyEqualityComparer GetNew(Func propertySelector) { return new PropertyEqualityComparer (propertySelector); } public static PropertyEqualityComparer GetNew (Func propertySelector, IEqualityComparer comparer) { return new PropertyEqualityComparer (propertySelector, comparer); } } 

现在,您需要做的就是使用该相等比较器调用Union(使用适合您情况的lambda实例化):

 var tr = List1.Union(List2, PropertyEqualityComparer.GetNew(n => n.Id)).ToList(); 

尝试这个

 var List3 = List1.Join( List2, l1 => l1.Id, l2 => l2.Id, (l1, l2) => new Model { Id = l1.Id, Val1 = l1.Val1 or other, Val2 = l2.Val2 or other }); 

有关详细信息,您可以显示您的模型