dallasbeek / Dapper.Database

Other
50 stars 11 forks source link

期待开放 TableInfo 的获取 #49

Open niuniu007 opened 3 months ago

niuniu007 commented 3 months ago
  在base calss 中,我希望能够使用下面这样的方法公共使用
    protected virtual int Count(SqlBuilder sqlWhere)
    {
        using (var conn = _connection.GetIDbConnection())
        {
            var buiderQuery = sqlWhere.AddTemplate($" select  count(1) from  {getTableName()}    /**where**/  ");
            System.Console.WriteLine(buiderQuery.RawSql);
            return conn.Query<int>(buiderQuery.RawSql, buiderQuery.Parameters).FirstOrDefault();
        }
    }

getTableName()用户获取当前对象对应的 tableName。我不知道在Dapper.Database 中是否有public方法获取到 tableName。 目前我是应用这样的方法获取:

` static MethodInfo sqlMapperExtensionsGetTableNameMethodInfo = null;

protected string getTableName() {

 // Check if we've already set our custom table mapper to TableNameMapper.
 if (SqlMapperExtensions.TableNameMapper != null)
     return SqlMapperExtensions.TableNameMapper(typeof(T));

 if (sqlMapperExtensionsGetTableNameMethodInfo == null)
 {
     string   getTableNameMethodName = "TableInfoCache";
     sqlMapperExtensionsGetTableNameMethodInfo = typeof(SqlMapperExtensions).GetMethod(getTableNameMethodName, System.Reflection.BindingFlags.IgnoreCase
         | BindingFlags.NonPublic
         | System.Reflection.BindingFlags.Static);

     if (sqlMapperExtensionsGetTableNameMethodInfo == null)
         throw new ArgumentOutOfRangeException($"Method '{getTableNameMethodName}' is not found in '{nameof(SqlMapperExtensions)}' class.");
 }
 // If not, we can use Dapper default method "SqlMapperExtensions.GetTableName(Type type)" which is unfortunately private, that's why we have to call it via reflection.
 TableInfo  tableInfo=  sqlMapperExtensionsGetTableNameMethodInfo.Invoke(null, new object[] { typeof(T) }) as TableInfo;
 if (tableInfo != null)
 {
     return  tableInfo.TableName;
 }
 throw new ArgumentOutOfRangeException($"  not found in    tableInfo  class.");

}

`

这很不方便

dallasbeek commented 1 week ago

Translated 在base calss 中,我希望能够使用下面这样的方法公共使用 In the base class, I want to be able to use the following method for public use

protected virtual int Count(SqlBuilder sqlWhere)
{
    using (var conn = _connection.GetIDbConnection())
    {
        var buiderQuery = sqlWhere.AddTemplate($" select  count(1) from  {getTableName()}    /**where**/  ");
        System.Console.WriteLine(buiderQuery.RawSql);
        return conn.Query<int>(buiderQuery.RawSql, buiderQuery.Parameters).FirstOrDefault();
    }
}

getTableName()用户获取当前对象对应的 tableName。我不知道在Dapper.Database 中是否有public方法获取到 tableName。 目前我是应用这样的方法获取: getTableName() user gets the tableName corresponding to the current object. I don't know if there is a public method in Dapper.Database to get the tableName. Currently I use this method to obtain:

` static MethodInfo sqlMapperExtensionsGetTableNameMethodInfo = null;

protected string getTableName() {

// Check if we've already set our custom table mapper to TableNameMapper. if (SqlMapperExtensions.TableNameMapper != null) return SqlMapperExtensions.TableNameMapper(typeof(T));

if (sqlMapperExtensionsGetTableNameMethodInfo == null) { string getTableNameMethodName = "TableInfoCache"; sqlMapperExtensionsGetTableNameMethodInfo = typeof(SqlMapperExtensions).GetMethod(getTableNameMethodName, System.Reflection.BindingFlags.IgnoreCase | BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);

 if (sqlMapperExtensionsGetTableNameMethodInfo == null)
     throw new ArgumentOutOfRangeException($"Method '{getTableNameMethodName}' is not found in '{nameof(SqlMapperExtensions)}' class.");

} // If not, we can use Dapper default method "SqlMapperExtensions.GetTableName(Type type)" which is unfortunately private, that's why we have to call it via reflection. TableInfo tableInfo= sqlMapperExtensionsGetTableNameMethodInfo.Invoke(null, new object[] { typeof(T) }) as TableInfo; if (tableInfo != null) { return tableInfo.TableName; } throw new ArgumentOutOfRangeException($" not found in tableInfo class."); }

`

这很不方便 this is very inconvenient