समाधान सरल है। आइए एक इंटरसेप्टर जोड़ें !!!
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;
}
}
रेगेक्स बेहतर हो सकता है, मुझे पता है। आइए हमारे इंटरसेप्टर को कॉन्फिग क्लास में पंजीकृत करें
public class PbsContextConfig : DbConfiguration
{
public PbsContextConfig()
{
this.AddInterceptor(new HintInterceptor());
}
}
आइए DbSet के लिए अच्छा Hint एक्सटेंशन बनाएं
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 == ....
संशोधनों का स्वागत है!