注入 TableName 作为参数以更新和插入 ServiceStack Ormlite 中的 GenericEntity

2023-11-30

我有 3 个结构相同的表,因此我使用 ServiceStack 创建了以下实体

public class GenericEntity
{
    [Alias("COL_A")]
    public string ColumnA { get; set; }
}

为了检索结果,我使用以下代码行。在其中我传递了诸如“TableAU”/“Table”之类的表名称,以便我可以提取适当的结果

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 和 DELETE 操作的表名称。是否有类似的插入和更新方法?下面是我用于更新和插入的代码片段

Insert

db.Insert(new GenericEntity() {});

Update

db.Update<GenericEntity>(new GenericEntity { ColumnA = "ModifiedData"},p => p.ColumnA == "OriginalData");

正如您希望对多个 API 执行此操作一样,我已经添加了一个测试展示如何通过使用您自己的自定义扩展方法扩展 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

注入 TableName 作为参数以更新和插入 ServiceStack Ormlite 中的 GenericEntity 的相关文章

随机推荐

  • Python 校准相机

    我有以下图像 I1 我没有捕捉到它 我从谷歌下载的 我将已知的单应性 H 应用到 I1 以获得以下图像 I2 我想假设相机拍摄了上面 I2 的照片 我不知道这个相机的相机矩阵 我想找到它 找到这个相机矩阵mtx 我正在使用OpenCV相机标
  • 如何使用exec()执行Python程序并获取变量?

    我想使用执行正确的Python程序exec 执行后获取变量及其值 谷歌说我应该创建一个字典并在那里写入执行结果 exec code object 在变量中 但不幸的是 Python 3 中没有这种情况 Python 3 中的代码应该是 ex
  • 为什么这个 RegExp exec 会导致无限循环?

    我有以下代码块 var field reg new RegExp i text This is a string with 1 param1 2 param2 and 3 param3 parameters while field reg
  • git:时区和时间戳格式

    从 git 我可以获得时间戳 2011 10 04 12 58 36 0600 但有什么办法可以将其显示为 2011 10 04 06 58 36 所以我想要的就是摆脱 0600 时区偏移 我怎样才能做到这一点 谢谢 如果您询问 git l
  • C++ - 加载所有文件名+计算当前目录中的文件数量+过滤文件扩展名

    我想计算当前目录中的文件数以及加载数组中的所有文件名 如果可能的话 我也想知道如何过滤文件扩展名 将以下程序链接到 lboost filesystem include
  • 参数“pathString”为空

    当我在 firebase 中执行查询时遇到错误 我的查询代码如下所示 Override protected void onCreate Bundle savedInstanceState super onCreate savedInstan
  • Spring jdbc“选择更新”

    我有以下与 Spring JDBC 一起使用的方法 public String getState String stateLink template queryForObject select state url from state sc
  • 0.0.0.0 是有效的 IP 地址吗?

    0 0 0 0 是有效的 IP 地址吗 我希望我的程序能够将其存储为没有地址正在使用的指示 但如果它实际上有效 则这将不起作用 It is valid因为它包含四个八位位组 每个八位位组都在 0 到 255 含 范围内 然而 它并不是usa
  • 如何从mysql表中选择最后N条记录

    此代码可用于从 mysql 中的表中选择前十条记录 如何执行相同操作来显示包含 1000 条记录的表中的最后 10 条记录 我想按升序显示名称 不想更改它 SELECT name cost FROM test orderby name as
  • 尝试在 Atom 中运行 Hydrogen 时如何修复“NotImplementedError”[重复]

    这个问题在这里已经有答案了 我正在尝试在 Atom 上运行 Hydrogen 但在 asyncio python 库中收到一条以 NotImplementedError 结尾的错误消息 我在 Windows 10 计算机上安装了 Pytho
  • 在React中将setInterval添加到componentDidMount

    我想每 1000 毫秒更新一次 React 组件的状态 但是 我尝试做setInterval on the componentDidMount 但没有运气 目前我得到两个结果console log 一个是构造函数中的空状态对象 另一个是从A
  • 包含 Rails 和 herokuapp 的子域

    我在子域上关注了瑞安 贝茨 Ryan Bates railscast http railscasts com episodes 123 subdomains revised 并使我的应用程序在本地完美运行 我已部署到 heroku 但无法让
  • bash 中“<(...)”“运算符”的名称是什么?

    我熟悉在 bash 中为命令输入创建 临时文件 例如 cat file 1 lt echo hello file 2 我想阅读有关该主题的更多信息 但不知道该主题的名称 lt 操作员 我怀疑这是一种 IO 重定向 这个符号 运算符有名称吗
  • 使用 javax.sound.samples 库时出现异常......!

    谁能告诉我我在这个java程序中哪里做错了 当我运行这个时 我总是会遇到异常 import java io import javax sound sampled public class x public static void main
  • 如何在Asp.Net中获取用户的AD用户组?

    我需要能够获取用户所在组的列表 但我需要以下一个 一些 所有属性可见 专有名称 name cn samac 帐户名 我现在所拥有的返回某种名称 但不是上面的任何名称 名称看起来很接近 但并非全部匹配正确 这就是我正在使用的 ArrayLis
  • 将列值粘贴到另一列

    我有一个简单的问题可以用以下方法解决paste我的数据框如下所示 x lt c 3 6 7 y lt c 0 25 0 35 0 62 dta1 lt data frame x y x y 1 3 0 25 2 6 0 35 3 7 0 6
  • 如何在 Symfony2 Twig 模板中获取配置参数

    我有一个 Symfony2 Twig 模板 我想输出这个树枝模板中的配置参数的值 版本号 因此我这样定义配置参数 parameters app version 0 1 0 我可以在控制器中使用此配置参数 但我不知道如何在我的 Twig 模板
  • Javascript 中的嵌套函数参数和“this”上下文

    我正在尝试使用两个对象创建函数调用链 我在代码中添加了注释来描述我想要做的事情 function Huh parentContext this parentContext parentContext this check function
  • 从同一部 iPhone 获取两个不同的设备 ID

    当我收到 iPhone 时 我得到了不同的 UDID来自 iTunes并以这样的方式编程 UDID String UIDevice current identifierForVendor uuidString 基本上我试图获取我的 iPho
  • 注入 TableName 作为参数以更新和插入 ServiceStack Ormlite 中的 GenericEntity

    我有 3 个结构相同的表 因此我使用 ServiceStack 创建了以下实体 public class GenericEntity Alias COL A public string ColumnA get set 为了检索结果 我使用以