2013-02-08 4 views
3

Я использую ServiceStack.OrmLite и хочу получить общее количество строк из таблицы. Я в настоящее время сделать, как указано в ServiceStack.OrmLite documentation черезПолучить имя таблицы класса во время выполнения в ServiceStack.OrmLite/избегать имен таблиц hardcoding

db.Scalar<int>("SELECT COUNT(*) FROM User"); 

Однако имя таблицы User может измениться в будущем, так что я искал способ не жёстко его. Можно ли получить имя таблицы из его соответствующего класса, например,

string table_name = db.GetTableName<User>(); 
db.Scalar<int>("SELECT COUNT(*) FROM {0}", table_name); 

?

+0

Я не знаю, как динамически получить имя таблицы, но в вашем конкретном случае вам не нужно вручную писать SQL для операции count (*). Вы можете сделать что-то вроде ** dbConnection.GetScalar (e => Sql.Count (e.Id)); ** – mbarthelemy

ответ

8

В 2 способа доступа к метаданным конфигурации ваших типов с:

ModelDefinition<User>.Definition.ModelName; 
typeof(User).GetModelMetadata().ModelName; 

Хотя в некоторых базах данных, которые необходимо привести свое имя таблицы, вы можете сделать это с помощью:

var modelDef = ModelDefinition<User>.Definition; 
OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef) 

Поэтому да, вы можете обернуть это методом расширения, который делает то, что вы хотите:

public static MyOrmLiteExtensions { 
    public static string GetTableName<T>(this IDbConnection db) { 
     var modelDef = ModelDefinition<T>.Definition; 
     return OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef); 
    } 
}