如何从表达式更新实体?
我动态构建应更新哪些属性(列)。执行此操作的函数将返回child_list[1]
Expression<Func<T, T>>
为T
的位置
我使用entity
和Where
从数据库加载了实体。
Single
我知道我可以使用EF Plus(批量更新),但我想坚持Expression<Func<T, T>> expr = this.CallVirtualMethodAndGetExpression(ModelFromRequest);
DbUser entity = this.context.Users.Where(t => t.Id == 1).Single();
some magic ??? //tried expr.Compile()(entity) but it does not work.
this.context.SaveChanges();
//use DbUser with updated properties of course.
(SaveChanges
之后我需要DbUser
我想避免发送另一个请求)。
更新
我有实体对象和表达式。现在,我需要根据表达式编辑实体对象,并调用SaveChanges
来更新实体。
答案 0 :(得分:2)
你正在寻找的魔术线:
var resultOfTypeT = expr.Compile().Invoke(entity)
但是entity
需要是T
类型的实例,而不是DbUser
所以这对我没有意义。
所以我无法给你准确的代码为你编译,因为我无法看到定义T
的方法签名。并且还不知道this.CallVirtualMethodAndGetExpression(ModelFromRequest)
的方法签名是什么样的。
但Compile()
会将Expression<Func<T,T>>
更改为Func<T,T>
,如果您拥有Invoke
的有效实例,那么可以Func<T,T>
定义T
的功能{1}}传递给它。
现在您的entity
不属于T
类型,因为它的类型为DbUser
所以您可能需要更改方法签名或以通用方式获取DbUser或者其他的东西。如果您只需要传递DbUser
实例,则不需要c#Generics。但不能仅仅掌握当前可用的信息。