2020-02-13 10:35

EF Core 3.1 取得 IQueryable 的 SQL

  1. private static T getPrivate<T>(this object obj, string privateField) 
  2. { 
  3.    return (T)obj?.GetType() 
  4.        .GetField(privateField, BindingFlags.Instance | BindingFlags.NonPublic) 
  5.        ?.GetValue(obj); 
  6. } 
  7.  
  8. public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class 
  9. { 
  10.    var enumerator = query.Provider.Execute<IEnumerable<TEntity>>(query.Expression).GetEnumerator(); 
  11.  
  12.    var relationalQueryContext = enumerator.getPrivate<RelationalQueryContext>("_relationalQueryContext"); 
  13.    var relationalCommandCache = enumerator.getPrivate<RelationalCommandCache>("_relationalCommandCache"); 
  14.  
  15. #pragma warning disable EF1001 // Internal EF Core API usage. 
  16.    IRelationalCommand command = relationalCommandCache.GetRelationalCommand(relationalQueryContext.ParameterValues); 
  17. #pragma warning restore EF1001 // Internal EF Core API usage. 
  18.  
  19.    return command.CommandText; 
  20. }