1

我目前有一些我在一些 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 结合使用?

4

0 回答 0