asp.net - 如何在 Entity Framework 中禁用每个查询的查询执行计划缓存?

标签 asp.net sql-server entity-framework

是否有机会使用 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/

相关文章:

c# - EF - 具有自动迁移功能的新列的默认值

c# - 获取应用程序目录的完整路径

c# - 获取点击的 Html 链接的 ID 并将其用作 C# 中 SqlDataSource 的参数

c# - colspan 搞砸了 css asp.net 表

sql - 尝试将数据库发布到没有聚集索引的 Azure 时出错

mysql - sql - 按计数更新列

c# - “无法访问已处置的上下文实例。”从存储库调用方法时出错

c# - ASP.NET MVC 6 中的 MVC Controller 和 Web API Controller 有什么区别?

java - 如何从 Azure 移动服务获取数据

entity-framework - 将聚合选择表达式传递给 Dynamic Linq 的 GroupBy