我有三门课:
public partial class Objective{
public Objective() {
this.ObjectiveDetails = new List<ObjectiveDetail>();
}
public int ObjectiveId { get; set; }
public int Number { get; set; }
public virtual ICollection<ObjectiveDetail> ObjectiveDetails { get; set; }
}
public partial class ObjectiveDetail {
public ObjectiveDetail() {
this.SubTopics = new List<SubTopic>();
}
public int ObjectiveDetailId { get; set; }
public int Number { get; set; }
public string Text { get; set; }
public virtual ICollection<SubTopic> SubTopics { get; set; }
}
public partial class SubTopic {
public int SubTopicId { get; set; }
public string Name { get; set; }
}
我有两个清单:
IList<ObjectiveDetail> oldObj;
IList<ObjectiveDetail> newObj;
下面的 LINQ 给了我一个新的列表ObjectiveDetail
对象,其中:任何的数字或文本字段ObjectiveDetail
列表中的对象之间存在差异oldObj
and newObj
.
IList<ObjectiveDetail> upd = newObj
.Where(wb => oldObj
.Any(db => (db.ObjectiveDetailId == wb.ObjectiveDetailId) &&
(db.Number != wb.Number || !db.Text.Equals(wb.Text))))
.ToList();
我如何修改它以便 LINQ 给我一个新的列表ObjectiveDetail
对象,其中:数字或文本字段或副主题集合对于任何ObjectiveDetail
列表中的对象之间存在差异oldObj
and newObj
.
换句话说,我想要一个ObjectiveDetail
要添加到upd
列出如果:
- oldObj 中的文本与 newObj 中的文本不同
- oldObj 中的数字与 newObj 中的数字不同
- 它有一个 SubTopics 集合,其中 oldObj 中有 3 个元素,newObj 中有 4 个元素
- 它有一个 SubTopics 集合,oldObj 中没有元素,newObj 中有 2 个元素
- 它有一个 SubTopics 集合,oldObj 中有 2 个元素,newObj 中没有元素
- 它有一个 SubTopics 集合,其中 oldObj 中 SubTopicId 为 1 和 2 以及 newObj 中 SubTopicId 为 1 和 3 的元素
我希望有人可以在我已有的 LINQ 语句中添加一些额外的行。
我不会创建一个巨大且难以维护的 LINQ 查询来尝试查找差异,而是在两个列表(交集)中创建相同对象的列表,结果,取除此交集之外的两个集合的总和。要比较可以使用的对象IEqualityComparer<>
执行。这是一个草稿:
public class ObjectiveDetailEqualityComparer : IEqualityComparer<ObjectiveDetail>
{
public bool Equals(ObjectiveDetail x, ObjectiveDetail y)
{
// implemenation
}
public int GetHashCode(ObjectiveDetail obj)
{
// implementation
}
}
然后简单地:
var comparer = new ObjectiveDetailEqualityComparer();
var common = oldObj.Intersect(newObj, comparer);
var differs = oldObj.Concat(newObj).Except(common, comparer);
当类发生变化(新属性等)时,这将更容易维护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)