如何在 EFCore 中内联参数?

问题描述 投票:0回答:1

然后跟踪查询的性能,您可以调用 ToQueryString 方法。如果查询中有很多参数,只需添加 @p1、@p2 等。如果要内联该怎么办?

sql parameters entity-framework-core inline
1个回答
0
投票

您可以仅使用此表达式访问者作为内联参数:

public class ParameterReplacer : System.Linq.Expressions.ExpressionVisitor
{
    protected override Expression VisitMember(MemberExpression node)
    {
        // Если это доступ к полю или свойству константного выражения
        if (node.Expression is ConstantExpression constantExpression)
        {
            var container = constantExpression.Value;
            var member = node.Member;

            if (member is System.Reflection.FieldInfo field)
            {
                var value = field.GetValue(container);
                if (value is string or not IEnumerable)
                {
                    return Expression.Constant(value, field.FieldType);
                }
            }
            else if (member is System.Reflection.PropertyInfo property)
            {
                var value = property.GetValue(container);
                if (value is string or not IEnumerable)
                {
                    return Expression.Constant(value, property.PropertyType);
                }
            }
        }

        return base.VisitMember(node);
    }

    public static IQueryable<T> ReplaceParamToConst<T>(IQueryable<T> query)
    {
        var replacer = new ParameterReplacer();
        return query.Provider.CreateQuery<T>(replacer.Visit(query.Expression));
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.