【发布时间】:2015-02-22 19:08:35
【问题描述】:
我有 2 个对象(一个 DTO 和一个入口框架对象),如果 DTO 中的相应值不同,我想更新 EF 实体。我设想它会这样做:
UpdateIfDifferent(dtoObject, x => x.MailStatus, efObject, r => r.MailStatus);
UpdateIfDifferent(dtoObject, x => x.WebStatus, efObject, r => r.WebStatus);
private void UpdateIfDifferent<TOriginal, TOriginalProperty, TUpdated, TUpdatedProperty>
(TOriginal original, Expression<Func<TOriginal, TOriginalProperty>> originalProperty,
TUpdated updated, Expression<Func<TUpdated, TUpdatedProperty>> updatedProperty)
{
if (!originalProperty.Compile()(original).Equals(updatedProperty.Compile()(updated))) {
// how do I assign back to original from updated?
}
}
}
我相信以下应该可以工作,但我不知道如何将值分配回 efObject。谁能帮我解答一下?
【问题讨论】:
-
你需要从
originalProperty.Body得到MemberExpression,然后得到PropertyInfo,然后你可以调用Get\SetValue方法传递你原来\更新的实体 -
Jonathan,我真的相信你不会从介绍这个方法中得到太多帮助。它的签名令人困惑,实现只是一个“如果”和一个赋值。如果我是你,我会重新考虑我的方法并重构我的代码以完全删除此方法。在我看来,单行 if 和赋值而不是方法调用会使代码更简洁。
标签: c# entity-framework lambda expression-trees