如何在Entity Framework中指定索引提示?

SQL

select * from table1 with(index=IX_table1_1) 

Linq to sql使用ado.net实体想编写上面的代码。 我特别找不到实体,使用索引。

LINQ

 var querysample = from a in db.table1 select a; 

解决方案很简单。 让我们添加一个拦截器!

  public class HintInterceptor : DbCommandInterceptor { private static readonly Regex _tableAliasRegex = new Regex(@"(?AS \[Extent\d+\](?! WITH \(*HINT*\)))", RegexOptions.Multiline | RegexOptions.IgnoreCase); [ThreadStatic] public static string HintValue; public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext 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 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类中注册我们的Interceptor

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

让我们为DbSet做一个很好的提示扩展

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

如何使用 ?

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

欢迎修改!

L2S和EF都不会像SQL那样(索引提示等)提供对SQL的直接支持,尽管使用L2S可以通过ExecuteQuery(...) (它采用原始TSQL)来实现。 如果您需要该级别的控制,请考虑存储过程或备用ORM。

这里特别的一个问题是查询提示非常特定于平台,但EF尝试与平台无关。