0

Then track performance of query you can invoke ToQueryString method. If you have a lot of parameters in query it just add @p1, @p2, etc. What to do if you want inline it?

3
  • There are several different ways. The degree of their applicability depends on the DBMS used, so specify it. For example, you can use an array in PostgreSQL or a TVP in Sql Server. Also we can use JSON and functions like OPENJSON in Sql Server or JSON_EACH in SQLite. We can also create a temporary table, fill in the data and then JOIN it to the query. Commented Jul 8 at 7:23
  • Inline... only for the query string? You probably don't want to inline parameters for query execution, do you? Commented Jul 8 at 11:26
  • @GertArnold, looks like bad prepared Q&A. OP is trying to show how to visualise complex query without parameters for probably Copy/Paste to SQL Analyser or other tool. Commented Jul 9 at 4:12

1 Answer 1

0

You can just use this expression visitor for inline parameters:

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));
    }
}

Usage: ParameterReplacer.ReplaceParamToConst(query).ToQueryString();

Not the answer you're looking for? Browse other questions tagged or ask your own question.