我目前有一些我在一些 IQueryable 调用中手动使用的 ExpressionVisitor
但我想使用拦截器将它们挂钩到所有查询中,但是我需要将它们转换为 DbExpressionVistors
我想我已经对它们进行了排序,除了一个,它接受一个参数值并将其作为常量输出,以创建基于租户 ID 的唯一查询计划
我遇到的问题是,我似乎无法找到一种方法将 DbParameterReferenceExpression 中的参数值提取为常量值,就像之前的 ExpressionVisitor 代码一样:
public class DeParameterizeTenantIdVisitor : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression node)
{
if (IsTenantType(node))
{
var expression = Visit(node.Expression);
var constantExpression = expression as ConstantExpression;
var val = GetValue(constantExpression, node.Member);
if(val != null)
return Expression.Constant(val);
}
return base.VisitMember(node);
}
private static bool IsTenantType(Expression node)
{
return node.Type == typeof(OrganizationId);
}
private static object GetValue(ConstantExpression constantExpression, MemberInfo member)
{
if (constantExpression != null)
{
var container = constantExpression.Value;
var info = member as FieldInfo;
if (info != null)
{
var value = info.GetValue(container);
return value;
}
var propertyInfo = member as PropertyInfo;
if (propertyInfo != null)
{
var value = propertyInfo.GetValue(container, null);
return value;
}
}
return null;
}
}
有人对此有任何意见或反馈吗?我一直在四处寻找它,但它似乎是我要进入的非常实验性的领域!
编辑: 或者是否可以将我现有的 ExpressionVisitior 与拦截器或 DbExpressionVisitor 结合使用?