获取2个linq实体和​​关联的子实体之间的差异

时间:2017-11-15 18:55:00

标签: c# entity-framework linq system.reflection

我想比较两个相同类型的LINQ实体,并返回两者之间的列表差异。我有代码比较属性并返回差异。

(来自:https://stackoverflow.com/a/5812100/2343826

    public static void WriteChanges<T>(T obj1, T obj2, string objName, int objId, int userId)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
        StringBuilder sb = new StringBuilder();

        foreach (PropertyInfo pi in properties)
        {
            object value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null);
            object value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null);

            if (value1 != value2 && (value1 == null || !value1.Equals(value2)))
            {
                sb.Append(string.Format("Property {0} changed from {1} to {2}" + Environment.NewLine, pi.Name, value1, value2));
            }
        }
        Write(objName, objId, sb.ToString(), userId);
    }

结果IN:

属性oItem从NS.oItem更改为NS.oItem
属性dvPC已从pcName1更改为pcName2

是否可以修改此代码以确定该属性是否也是LINQ实体,如果是,则以递归方式检查子实体是否存在差异?

例如,在上面的示例结果中,NS.oItem是与obj1关联的子实体。我希望该方法迭代子对象以比较obj1和obj2之间的差异

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你可以这样做,但混合模板和反射会使它变得不必要地复杂 - 我将其重新编写为非模板函数,它可以只取两个类型为object的变量并且如果它们是不是同一类型。我不确定为什么你需要检查一个属性“是”一个LINQ实体(它真的没有意义 - 你的意思是,映射到一个实体框架实体?但是你需要阻止无限递归吗?类型A的对象具有类型B的属性,该属性也具有类型A的属性。(对于捕获外键关系,这对于EF实体来说并不罕见 - 并且对于具有ForeignKey注释的任何属性不会递归可能是什么你想要的。)