如何在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
我知道,正则表达式会更好。 让我们在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尝试与平台无关。