2016-06-30 10 views
0

This article erklärt, dass Query Plan Caching deaktiviert werden kann, indem EnablePlanCaching auf false auf der ObjectQuery, und auch, dass es standardmäßig in EF6 aktiviert ist.Entity Framework's 6's `ObjectQuery.EnablePlanCaching` - wo ist es?

Leider hat EF6 keine ObjectQuery, die DbSet gibt Ihnen DbQuery s.

Ich glaube nicht, dass ich eine ObjectQuery von der DbQuery bekommen kann, und ich will sicherlich nicht die alte ObjectContext verwenden. So ist es oder gibt es eine Möglichkeit, Plan-Caching in EF6 zu deaktivieren?

+0

EF6 hat DbContext und DbSet erhalten lassen und unterstützen Object nicht mehr! –

Antwort

1

Hier ist eine Erweiterung Methode, die Sie Object vom DbSet

using (var ctx = new TestContext()) 
{ 
    var query = ctx.Products; 
    query.GetObjectQuery().EnablePlanCaching = false; 
    var list = query.ToList(); 
} 


namespace Z.EntityFramework.Plus 
{ 
    internal static partial class InternalExtensions 
    { 
     /// <summary>An IQueryable&lt;TEntity&gt; extension method that get the ObjectQuery from the query.</summary> 
     /// <typeparam name="T">The type of elements of the query.</typeparam> 
     /// <param name="query">The query to get the ObjectQuery from.</param> 
     /// <returns>The ObjectQuery from the query.</returns> 
     internal static ObjectQuery<T> GetObjectQuery<T>(this IQueryable<T> query) 
     { 
      // CHECK for ObjectQuery 
      var objectQuery = query as ObjectQuery<T>; 
      if (objectQuery != null) 
      { 
       return objectQuery; 
      } 

      // CHECK for DbQuery 
      var dbQuery = query as DbQuery<T>; 

      if (dbQuery == null) 
      { 
       throw new Exception("Oops! A general error has occurred. Please report the issue including the stack trace to our support team: [email protected]"); 
      } 

      var internalQueryProperty = dbQuery.GetType().GetProperty("InternalQuery", BindingFlags.NonPublic | BindingFlags.Instance); 
      var internalQuery = internalQueryProperty.GetValue(dbQuery, null); 
      var objectQueryContextProperty = internalQuery.GetType().GetProperty("ObjectQuery", BindingFlags.Public | BindingFlags.Instance); 
      var objectQueryContext = objectQueryContextProperty.GetValue(internalQuery, null); 

      objectQuery = objectQueryContext as ObjectQuery<T>; 

      return objectQuery; 
     } 
    } 
} 
Verwandte Themen