【发布时间】:2018-08-23 01:33:44
【问题描述】:
我有以下函数,它实际上是 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; }
}
顺便说一句,“问题”类实现了 IBaseEntity。
我想要做的是自动将 ModifiedBy 和 ModifiedDate 附加到 UpdateBulk 函数中的 updateFactory,这样就不必在每次调用 UpdateBulk 时都这样做。
我尝试在上面的 UpdateBulk 函数中将解析的“updateFactory”表达式与“modifiedExpression”组合,但它返回错误:
二元运算符 AndAlso 没有为类型“问题”定义
是否可以像这样合并表达式,如果可以,我做错了什么? 如果没有,如何将 ModifiedBy = "Test", ModifiedDate = DateTime.Now 合并到 updateFactory 表达式中?
谢谢, 棒
【问题讨论】:
-
尝试将
.Where(e => e.ProbId == probId)更改为.Where(e=> e.ProbId == null ? (e.ProbId == probId) : false)?有时这个问题是由返回的空数据引起的。 -
嗨 MatrixTai。感谢您的回复,ProbId 在数据库中被列为不可为空。无论如何我尝试了你的建议,但仍然遇到同样的错误。杆
-
AndAlso用于Expression<Func<T,bool>>,对于Expression<Func<T,T>>,您需要定义一个表达式访问者here
标签: c# linq expression entity-framework-plus