【问题标题】:Get differences between 2 linq entities and associated children entities获取 2 个 linq 实体和关联的子实体之间的差异
【发布时间】:2017-11-16 04:11:38
【问题描述】:

我想比较两个相同类型的 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);
    }

结果:

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

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

例如,在上面的示例结果中,NS.oItem 是与 obj1 关联的子实体。我想要遍历子对象的方法来比较obj1和obj2之间的差异

感谢您的帮助

【问题讨论】:

  • 您可以在 Linq 表达式中使用该方法。我无法正确解决您的问题。请您提供一些代码吗?
  • 嗨@Rainman - 感谢您的意愿...我已经将上面的问题更改为更简洁。让我知道.. 再次感谢!

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多