问题描述
网上最多就是类似于在 IQueryable 上面扩展方法,这样只能获取查询列表的SQL 语句,但如果 我是查
_dbContext.Set<T>().AsNoTracking().FirstOrDefaultAsync(predicate);
这样,我只能使用
_dbContext.Set<T>().AsNoTracking().ToQueryString();
来获取SQL语句,这个 ToQueryString 方法并没有 sql语句的 where 部分语句,也就是没有条件。只生成了 select 字段列表 from 表。
我想要的
我想的是能不能获取到的 SQL 语句 ,跟在 Sql Server Profiler 一样。 或者像 SqlSugar一样支持 Ado 切面。但现在 EF core 好像是没有办法的。
sql sugar获取 SQL 语句
var db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = ConnStr,
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
//sql执行前
db.Aop.OnLogExecuting = (sql, pars) =>
{
Debug.WriteLine("SQL执行前==>>>" + sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
if (db.TempItems == null) db.TempItems = new Dictionary<string, object>();
};
//sql执行后
db.Aop.OnLogExecuted = (sql, pars) =>
{
Debug.WriteLine("SQL执行后==>>>" + sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
};
//sql执行错误
db.Aop.OnError = (pars) =>
{
};
标签:
貌似不需要,可以直接打印在console里面
我在以前ef2.0的时候通过下面的代码对
IQueryable<TEntity>
扩展是可以的。尝试一下以下代码:
有很多中方法实现
1、自定义DbCommandInterceptor
2、自定义Logger,在输出日志中拦截处理