sql >> データベース >  >> RDS >> Sqlserver

Entity Frameworkでインデックスヒントを指定するにはどうすればよいですか?

    解決策は簡単です。インターセプターを追加しましょう!!!

        public class HintInterceptor : DbCommandInterceptor
    {
        private static readonly Regex _tableAliasRegex = new Regex(@"(?<tableAlias>AS \[Extent\d+\](?! WITH \(*HINT*\)))", RegexOptions.Multiline | RegexOptions.IgnoreCase);
    
        [ThreadStatic] public static string HintValue;
    
        public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            if (!String.IsNullOrWhiteSpace(HintValue))
            {
                command.CommandText = _tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (*HINT*)");
                command.CommandText = command.CommandText.Replace("*HINT*", HintValue);
            }
    
            HintValue = String.Empty;
        }
    
        public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            if (!String.IsNullOrWhiteSpace(HintValue))
            {
                command.CommandText = _tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (*HINT*)");
                command.CommandText = command.CommandText.Replace("*HINT*", HintValue);
            }
    
            HintValue = String.Empty;
        }
    }
    

    正規表現の方が良いかもしれません。インターセプターをConfigクラスに登録しましょう

    public class PbsContextConfig : DbConfiguration
    {
        public PbsContextConfig()
        {
            this.AddInterceptor(new HintInterceptor());
        }
    }
    

    DbSetのヒント拡張機能を作成しましょう

    public static class HintExtension
    {
        public static DbSet<T> WithHint<T>(this DbSet<T> set, string hint) where T : class
        {
            HintInterceptor.HintValue = hint;
            return set;
        }
    }
    

    使い方は?

    context.Persons.WithHint("INDEX(XI_DOWNTIME_LOCK)").Where( x => x.ID == ....
    

    変更を歓迎します!



    1. pip install mysqlclientは致命的なエラーを返しますC1083:ファイルを開くことができません:'mysql.h':そのようなファイルまたはディレクトリはありません

    2. 配列をmysqlに渡す

    3. EssentialPostgreSQLモニタリング-パート2

    4. MySQLで最大値のレコードを取得する方法