我有以下函数,实际上是Z.EntityFramework.Plus批量更新的包装器:
public static int UpdateBulk<T>(this IQueryable<T> query, Expression<Func<T, T>> updateFactory) where T : IBaseEntity, new()
{
Expression<Func<T, T>> modifiedExpression = x => new T() { ModifiedBy = "Test", ModifiedDate = DateTime.Now };
var combine = Expression.Lambda<Func<T, T>>(
Expression.AndAlso(
Expression.Invoke(updateFactory, updateFactory.Parameters),
Expression.Invoke(modifiedExpression, modifiedExpression.Parameters)
),
updateFactory.Parameters.Concat(modifiedExpression.Parameters)
); //This returns an error
return query.Update(combine);
}
这样调用:
decimal probId = ProbId.ParseDecimal();
db.Problems
.Where(e => e.ProbId == probId)
.UpdateBulk(e => new Problem() {
CatId = Category.ParseNullableInt(),
SubCatId = SubCategory.ParseNullableInt(),
ListId = Problem.ParseNullableInt()
});
IBaseEntity的定义如下:
public abstract class IBaseEntity
{
public System.DateTime CreatedDate { get; set; }
public string CreatedBy { get; set; }
public System.DateTime ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
public string DeletedBy { get; set; }
}
顺便提一下,“Problem”类实现了“IBaseEntity”。
我的目的是在UpdateBulk函数中自动附加ModifiedBy和ModifiedDate到updateFactory中,这样就不必在每次调用UpdateBulk时都进行操作。
我试着在上面的UpdateBulk函数中将解析后的“updateFactory”表达式与“modifiedExpression”合并,但返回以下错误:
“ ‘AndAlso’二进制运算符对类型‘Problem’未定义”
是否可能像这样合并Expression,如果可以,我做错了什么? 如果不行,怎样才能将ModifiedBy =“Test”,ModifiedDate = DateTime.Now合并到updateFactory表达式中?
谢谢,Rod
.Where(e => e.ProbId == probId)
更改为.Where(e=> e.ProbId == null ? (e.ProbId == probId) : false)
?有时这个问题是由于返回了空数据引起的。 - MT-FreeHK