示例#1
0
        public static QueryPlan ExplainQuery(this IManagedConnection runner, NpgsqlCommand cmd, Action <IConfigureExplainExpressions> configureExplain = null)
        {
            var serializer = new JsonNetSerializer();

            var config = new ConfigureExplainExpressions();

            configureExplain?.Invoke(config);

            cmd.CommandText = string.Concat($"explain ({config} format json) ", cmd.CommandText);
            return(runner.Execute(cmd, c =>
            {
                using (var reader = cmd.ExecuteReader())
                {
                    var queryPlans = reader.Read() ? serializer.FromJson <QueryPlanContainer[]>(reader.GetTextReader(0)) : null;
                    var planToReturn = queryPlans?[0].Plan;
                    if (planToReturn != null)
                    {
                        planToReturn.PlanningTime = queryPlans[0].PlanningTime;
                        planToReturn.ExecutionTime = queryPlans[0].ExecutionTime;
                        planToReturn.Command = cmd;
                    }
                    return planToReturn;
                }
            }));
        }
示例#2
0
        public static QueryPlan?ExplainQuery(this IManagedConnection runner, ISerializer serializer, NpgsqlCommand cmd, Action <IConfigureExplainExpressions>?configureExplain = null)
        {
            var config = new ConfigureExplainExpressions();

            configureExplain?.Invoke(config);

            cmd.CommandText = string.Concat($"explain ({config} format json) ", cmd.CommandText);

            using var reader = runner.ExecuteReader(cmd);

            var queryPlans   = reader.Read() ? serializer.FromJson <QueryPlanContainer[]>(reader, 0) : null;
            var planToReturn = queryPlans?[0].Plan;

            if (planToReturn == null)
            {
                return(null);
            }

            planToReturn.PlanningTime  = queryPlans ![0].PlanningTime;