Hi,
Would it be possible to have an easy to use method to get the SQL for a given query? (when available)
This is pratical to debug the application (or to create views )
I use the following method:
public string GetSqlForQuery<T>(IQueryable<T> query)
{
var recordSet = ((Xtensive.Storage.Linq.Queryable<T>)query).Compiled;
var executableProvider = CompilationContext.Current.Compile(recordSet.Provider);
Xtensive.Storage.Providers.Sql.SqlProvider sqlProvider = executableProvider as Xtensive.Storage.Providers.Sql.SqlProvider;
DomainHandler domainHandler = (DomainHandler)typeof(Xtensive.Storage.Providers.Sql.SqlProvider).GetProperty("DomainHandler", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(sqlProvider, null);
var compiled = sqlProvider.Request.GetCompiledStatement((Xtensive.Storage.Providers.Sql.DomainHandler)domainHandler);
return compiled.ToString();
}
The reflection part is a bit hackish : is there a better way to do this?
Bonus question : the domain provides Model (from assemblies) and Schema (database schema after Domain.Build() )
How di I link them? (Ie get the tables names for a given TypeInfo, the column name for a given property, ...)
Updated at 24.06.2010 9:35:16
Thanks for your response!
session.Services.Demand<SessionHandler>();
does not exists in DO 4.3 RC
What's the equivalent?
PS: I apologize for the poor english of my title ;)
Updated at 24.06.2010 14:41:29
Ok here is the final version :
using Xtensive.Core;
...
public string GetSqlForQuery<T>(IQueryable<T> query, Session session)
{
var recordSet = ((Xtensive.Storage.Linq.Queryable<T>)query).Compiled;
var executableProvider = Xtensive.Storage.Rse.Compilation.CompilationContext.Current.Compile(recordSet.Provider);
Xtensive.Storage.Providers.Sql.SqlProvider sqlProvider = executableProvider as Xtensive.Storage.Providers.Sql.SqlProvider;
var sessionHandler = session.Services.Demand<Xtensive.Storage.Providers.SessionHandler>();
var domainHandler = sessionHandler.Handlers.DomainHandler;
var compiled = sqlProvider.Request.GetCompiledStatement((Xtensive.Storage.Providers.Sql.DomainHandler)domainHandler);
return compiled.ToString();
}
Alex : thanks for your help!
This will be put to good use ;)
This thread was imported from our support forum. The original discussion may contain more detailed answer.
asked
Jun 23 '10 at 15:23
olorin
358●87●87●92