【问题标题】:How to disable query execution plan caching per query in Entity Framework?如何在实体框架中禁用每个查询的查询执行计划缓存?
【发布时间】:2015-09-19 12:32:40
【问题描述】:

是否有机会使用实体框架禁用查询执行计划缓存?

我知道在 objectQuery 中我可以在每个查询中禁用它:https://msdn.microsoft.com/pl-pl/library/system.data.objects.objectquery.enableplancaching(v=vs.110).aspx) 但我在 dbQuery 中没有看到这样的选项。

我也知道 EF 6 中有拦截器,我可以简单地附加选项(重新编译),但我找不到解决方案如何仅将其附加到一个确切的查询而不是上下文中的每个查询。

【问题讨论】:

  • 您究竟为什么要尝试禁用 LinqToEntity 查询计划缓存?你知道这纯粹是为了生成 SQL,而不是 SQL Server 查询计划……对吧?
  • 当然我知道 EF 是用于 sql 生成的,它被设计为跨数据库。但仍在寻找解决我的问题的方法。
  • @Aron - 如果他想禁用缓存有什么关系?一方面,我还尝试禁用一个特定查询的缓存,因为多次执行时得到的结果不正确

标签: asp.net sql-server entity-framework


【解决方案1】:

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;
    }

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多