是否有机会使用 Entity Framework 禁用查询执行计划缓存?
我知道在 objectQuery 中我可以按查询禁用它:https://msdn.microsoft.com/pl-pl/library/system.data.objects.objectquery.enableplancaching(v=vs.110).aspx )
但是我在 dbQuery 中没有看到这样的选项。
我也知道 EF 6 中有拦截器,我可以简单地附加选项(重新编译),但我找不到如何将它仅附加到一个确切的查询而不是上下文中的每个查询的解决方案。
最佳答案
灵感来自 Entity Framework's 6's `ObjectQuery.EnablePlanCaching` - where is it?我曾经写过这个:
var optimizedQuery = DisablePlanCaching(query).AsNoTracking();
使用这些扩展方法:
public static IQueryable<T> DisablePlanCaching<T>(IQueryable<T> query)
{
var objectQuery = GetObjectQuery(query);
if (objectQuery != null)
{
objectQuery.EnablePlanCaching = false;
}
return query;
}
private static ObjectQuery GetObjectQuery<T>(IQueryable<T> query)
{
var objectQuery = query as ObjectQuery<T>;
if (objectQuery == null)
{
var dbQuery = query as DbQuery<T>;
if (dbQuery != null)
{
objectQuery = DbQueryToObjectQuery(dbQuery);
}
}
return objectQuery;
}
public static ObjectQuery<T> DbQueryToObjectQuery<T>(DbQuery<T> dbQuery)
{
FieldInfo internalQueryField = dbQuery.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.FirstOrDefault(f => f.Name.Equals("_internalQuery"));
var internalQuery = internalQueryField?.GetValue(dbQuery);
FieldInfo objectQueryField = internalQuery?.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.FirstOrDefault(f => f.Name.Equals("_objectQuery"));
var objectQuery = objectQueryField?.GetValue(internalQuery) as ObjectQuery<T>;
return objectQuery;
}
关于asp.net - 如何在 Entity Framework 中禁用每个查询的查询执行计划缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31176775/