DocSpace-buildtools/common/ASC.Core.Common/EF/IQueryableExtensions.cs

30 lines
1.1 KiB
C#
Raw Normal View History

2022-02-15 11:52:43 +00:00
namespace ASC.Core.Common.EF;
public static class IQueryableExtensions
{
2022-02-15 11:52:43 +00:00
public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class
{
2022-02-15 11:52:43 +00:00
var enumerator = query.Provider.Execute<IEnumerable<TEntity>>(query.Expression).GetEnumerator();
var relationalCommandCache = enumerator.Private("_relationalCommandCache");
var selectExpression = relationalCommandCache.Private<SelectExpression>("_selectExpression");
var factory = relationalCommandCache.Private<IQuerySqlGeneratorFactory>("_querySqlGeneratorFactory");
2022-02-15 11:52:43 +00:00
var sqlGenerator = factory.Create();
var command = sqlGenerator.GetCommand(selectExpression);
2022-02-15 11:52:43 +00:00
var sql = command.CommandText;
2022-02-15 11:52:43 +00:00
return sql;
}
2022-02-15 11:52:43 +00:00
private static object Private(this object obj, string privateField)
{
return obj?.GetType().GetField(privateField, BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(obj);
}
2022-02-15 11:52:43 +00:00
private static T Private<T>(this object obj, string privateField)
{
return (T)obj?.GetType().GetField(privateField, BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(obj);
}
}