我有3个相同结构的表,所以我使用ServiceStack创建了以下实体
public class GenericEntity
{
[Alias("COL_A")]
public string ColumnA { get; set; }
}
为了重新检索结果,我使用以下代码行。在其中我传递表名称如“TableA”/“TableB”,以便我可以得到适当的结果
db.Select<GenericEntity>(w => w.Where(whereExperssion).OrderBy(o => o.ColumnA).From("TableA"));
对于删除,我使用以下代码
db.Delete<GenericEntity>(w => w.Where(q => q.ColumnA == "A").From("TableA"));
使用From()我可以传递SELECT&amp;的表名。删除操作。插入和更新有类似的方法吗?以下是我用于更新和插入
的代码段db.Insert(new GenericEntity() {});
db.Update<GenericEntity>(new GenericEntity { ColumnA = "ModifiedData"},p => p.ColumnA == "OriginalData");
答案 0 :(得分:2)
正如您对多个API的想法一样,我added a test展示如何通过使用您自己的自定义扩展方法扩展OrmLite的API来实现所需的行为,该方法在运行时修改OrmLite的表元数据以添加新的API允许在运行时指定表名,即:
var tableName = "TableA"'
db.DropAndCreateTable<GenericEntity>(tableName);
db.Insert(tableName, new GenericEntity { Id = 1, ColumnA = "A" });
var rows = db.Select<GenericEntity>(tableName, q =>
q.Where(x => x.ColumnA == "A"));
rows.PrintDump();
db.Update(tableName, new GenericEntity { ColumnA = "B" },
where: q => q.ColumnA == "A");
rows = db.Select<GenericEntity>(tableName, q =>
q.Where(x => x.ColumnA == "B"));
rows.PrintDump();
使用这些扩展方法:
public static class GenericTableExtensions
{
static object ExecWithAlias<T>(string table, Func<object> fn)
{
var modelDef = typeof(T).GetModelMetadata();
lock (modelDef) {
var hold = modelDef.Alias;
try {
modelDef.Alias = table;
return fn();
}
finally {
modelDef.Alias = hold;
}
}
}
public static void DropAndCreateTable<T>(this IDbConnection db, string table) {
ExecWithAlias<T>(table, () => { db.DropAndCreateTable<T>(); return null; });
}
public static long Insert<T>(this IDbConnection db, string table, T obj, bool selectIdentity = false) {
return (long)ExecWithAlias<T>(table, () => db.Insert(obj, selectIdentity));
}
public static List<T> Select<T>(this IDbConnection db, string table, Func<SqlExpression<T>, SqlExpression<T>> expression) {
return (List<T>)ExecWithAlias<T>(table, () => db.Select(expression));
}
public static int Update<T>(this IDbConnection db, string table, T item, Expression<Func<T, bool>> where) {
return (int)ExecWithAlias<T>(table, () => db.Update(item, where));
}
}
以这种方式添加自己的扩展方法允许您使用自己的惯用API扩展OrmLite,因为OrmLite本身只是ADO.NET IDbConnection
上的一组扩展方法。