我正在研究服务的通用PATCH方法。
public virtual void Patch ( int id, Delta<TEntityView> view )
{
var type = typeof( TEntity );
TEntity model = Activator.CreateInstance( type ) as TEntity;
foreach( var changedProperty in view.GetChangedPropertyNames() )
{
var property = type.GetProperty( changedProperty );
var propertyType = property.PropertyType;
var retreived = view.TryGetPropertyValue( changedProperty, out object propval );
if ( retreived && property != null )
{
property.SetValue( model, propval, null );
}
}
UnitOfWork.Query<TEntity>( e => e.Id == id )
.Update( m => model );
}
在Update
语句中,我得到
System.Exception: 'Invalid Cast. The update expression must be of type MemberInitExpression.'
该方法在Entity Framework Plus(https://entityframework-plus.net/)中定义:
#region Assembly Z.EntityFramework.Plus.EF6, Version=1.12.14.0, Culture=neutral, PublicKeyToken=59b66d028979105b
public static int Update<T>(this IQueryable<T> query, Expression<Func<T, T>> updateFactory) where T : class;
我如下更改了我的方法:
public virtual void Patch ( int id, Delta<TEntityView> view )
{
var type = typeof( TEntity );
var bindings = new List<MemberBinding>();
foreach( var changedProperty in view.GetChangedPropertyNames() )
{
var property = type.GetProperty( changedProperty );
var propertyType = property.PropertyType;
var retreived = view.TryGetPropertyValue( changedProperty, out object propval );
if ( retreived && property != null )
{
bindings.Add( Expression.Bind( type.GetMember( changedProperty )[0], Expression.Constant( propval ) ) );
}
}
Expression ex = Expression.MemberInit( Expression.New( type ), bindings );
// Expression <-- have this
// Expression<Func<TModel, TModel>> updateFactory <-- need this
UnitOfWork.Query<TEntity>( e => e.Id == id )
.Update( ex );
}
现在,在更新中,我收到一条红色的消息:Argument 1: cannot convert from 'System.Linq.Expressions.Expression' to 'System.Linq.Expressions.Expression<System.Func<TEntity, TEntity>>'
我确定我缺少使魔术发挥作用的小东西。这是什么?
您做了最困难的部分,乍看之下它看起来是正确的,您想要的是将其包裹在lambda中,这样的部分就像x => ex:
var parameter = Expression.Parameter(type,"x");
var lambda = Expression.Lambda<Func<TEntity,TEntity>>(ex, parameter);
UnitOfWork.Query<TEntity>( e => e.Id == id )
.Update( lambda );
(从内存写入,以便进行验证)