问题似乎是使用了匿名类型常量表达式,这导致了
client evaluation
,和C#运算符
==
通过引用比较匿名类型,因此总是返回
false
.
key
带的表达式
entity
将参数替换为
Expression.Constant(entity)
Expression.Invoke
在这种情况下不起作用)
所以把线移走
var getKeyFunction = key.Compile();
foreach (var entity in entities)
{
var parameter = key.Parameters[0];
var body = Expression.Equal(
key.Body,
key.Body.ReplaceParameter(parameter, Expression.Constant(entity))
);
var query = Expression.Lambda<Func<TEntity, bool>>(body, parameter);
var exist = await table.AnyAsync(query);
// ...
}
哪里
ReplaceParameter
是常用的表达式助手方法:
public static partial class ExpressionUtils
{
public static Expression ReplaceParameter(this Expression expression, ParameterExpression source, Expression target)
=> new ParameterReplacer { Source = source, Target = target }.Visit(expression);
class ParameterReplacer : ExpressionVisitor
{
public ParameterExpression Source;
public Expression Target;
protected override Expression VisitParameter(ParameterExpression node)
=> node == Source ? Target : node;
}
}