如何从表达式更新实体?
我动态构建应更新哪些属性(列)。这样做的函数返回Expression<Func<T, T>>
,其中T
是entity
。
我使用Where
和Single
从数据库加载实体。
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.
我知道我可以使用EF Plus(批量更新),但我想坚持使用SaveChanges
(在DbUser
后我需要SaveChanges
,我想避免发送另一个请求)。
更新:
我有实体对象和表达式。现在,我需要根据表达式编辑实体对象,并调用SaveChanges
来更新实体。
你正在寻找的神奇线条:
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
定义的功能。
现在你的entity
不是T
类型,因为它的类型为DbUser
所以你可能需要更改你的方法签名或以通用的方式获取你的DbUser。如果您只需要传递DbUser
实例,则不需要c#Generics。但不能仅仅掌握当前可用的信息。