使用 Castle ActiveRecord 插入多行并忽略任何重复的推荐方法

2023-12-21

我有一个 webmethod,可以将一堆菜谱插入到数据库的队列中(用于存储用户有兴趣烹饪的菜谱,类似于 NetFlix 的电影队列)。用户可以一次检查一堆食谱并将其排队。我有类似这样的代码:

[WebMethod]
public void EnqueueRecipes(SecurityCredentials credentials, Guid[] recipeIds)
{
    DB.User user = new DB.User(credentials);

    using (new TransactionScope(OnDispose.Commit))
    {
       foreach (Guid rid in recipeIds)
       {
          DB.QueuedRecipe qr = new DB.QueuedRecipe(Guid.NewGuid(), user, new DB.Recipe(rid));
          qr.Create();
       }
    }
}

我对 UserId/RecipeId 有一个独特的约束,因此用户只能将菜谱排队一次。但是,如果他们碰巧选择了队列中已经存在的菜谱,我真的不想用错误消息打扰用户,我只想忽略该菜谱。

如果违反唯一约束,上面的代码将抛出 SQL 异常。解决这个问题的最佳方法是什么,只需忽略重复的行。我目前的想法是:

  • 1)首先从数据库中加载用户的整个队列并检查 首先列出该列表。如果食谱已经存在,只需continue在 for 循环。优点:不会将不必要的 SQL 插入发送到 数据库。缺点:速度较慢,特别是当用户队列很大时。
  • 2)不要使用ActiveRecord,而是传递整个recipeIds数组 转换为 SQL 函数。该函数将检查每一行是否存在 第一的。优点:可能很快,让 SQL 处理所有脏活。 缺点:破坏了 ActiveRecord 模式并需要新的数据库代码,即 通常更难维护且实施成本更高。
  • 3)每次循环后CreateAndFlush。基本上,不要运行整个 在单个事务中循环。添加添加的每一行并提交 捕获 SQL 错误并忽略。优点:启动成本低,而且不 需要新的 SQL 后端代码。缺点:插入速度可能较慢 一次将大量行存入数据库,尽管用户对此表示怀疑 会一次提交十几个左右的新食谱。

Castle 或 Hibernate 框架还有其他小技巧吗?另外,mySQL 后端是 PostgreSQL 9.0。谢谢!

Update:

我尝试了第一种方法,看起来效果很好。我突然想到我不必加载整个队列,只需加载recipeIds 中出现的队列即可。我相信我的foreach()循环现在是 O(n^2) 取决于效率List<Guid>::Contains()但我认为这对于我将要使用的尺寸来说可能是不错的。

//Check for dupes
DB.QueuedRecipe[] dbRecipes = DB.QueuedRecipe.FindAll(Expression.In("Recipe",
   (from r in recipeIds select new DB.Recipe(r)).ToArray()
));

List<Guid> existing = (from r in dbRecipes select r.Recipe.RecipeId).ToList();

using (new TransactionScope(OnDispose.Commit))
{
   foreach (Guid rid in recipeIds)
   {
      if (existing.Contains(rid))
         continue;

      DB.QueuedRecipe qr = new DB.QueuedRecipe(Guid.NewGuid(), user, new DB.Recipe(rid));
      qr.Create();
   }
}

您可以使用单个 SQL 语句来完成此操作:

INSERT INTO user_recipe
SELECT new_UserId, new_RecipeId
FROM   user_recipe
WHERE  NOT EXISTS (
   SELECT *
   FROM   user_recipe
   WHERE  (UserId, RecipeId) = (new_UserId, new_RecipeId)
   );

The SELECT仅当该行尚不存在时才返回该行,因此仅在这种情况下才会插入该行。


批量插入解决方案

如果您有一长串菜谱需要一次插入,您可以:

CREATE TEMP TABLE i(userId int, recipeid int) ON COMMIT DROP;

INSERT INTO i VALUES
(1,2), (2,4), (2,4), (2,7), (2,43), (23,113), (223,133);

INSERT INTO user_recipe
SELECT DISTINCT i.*  -- remove dupes from the insert candidates themselves
FROM   i
LEFT   JOIN user_recipe u USING (userid, recipeid)
WHERE  u.userid IS NULL;

一次插入一把的解决方案

正如迈克所评论的,临时表对于只有几条记录来说就有点过大了。

INSERT INTO user_recipe
SELECT i.* 
FROM  (
    SELECT DISTINCT *     -- only if you need to remove possible dupes
    FROM (
       VALUES (1::int, 2::int)
          ,(2, 3)
          ,(2, 4)
          ,(2, 4)            -- dupe will be removed
          ,(2, 43)
          ,(23, 113)
          ,(223, 133)
       ) i(userid, recipeid)
    ) i
LEFT   JOIN user_recipe u USING (userid, recipeid)
WHERE  u.userid IS NULL;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Castle ActiveRecord 插入多行并忽略任何重复的推荐方法 的相关文章

  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 从关键字后的文本中提取字符串

    我想从 SQL 字段中关键字后面的文本中提取内容 我有一个名为Description在表中 该字段的内容是 asdasf 关键字 狗 aeee 关键字 猫 ffffaa 关键词 狼 我想提取并保存 关键字 之后的文本 在本例中dog cat
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • ASP.NET - Crystal Report Viewer 打印按钮在 ASP.NET 中不起作用

    我正在使用 Visual Studio 2008 但我遇到了水晶报告问题 当我单击打印按钮时 它会将我带到弹出窗口 但未找到页面 弹出的网址是 http localhost aspnet client System Web 2 0 5072
  • 如何从 Powerpoint 2010 导出电影?

    如何使用 MS Office PIA 主互操作程序集 或其他方式以编程方式将嵌入视频从 powerpoint 2010 导出到外部文件 在演示文稿中嵌入视频是 Powerpoint 2010 中的一项新功能 我找不到解决方案 PPTX 文件
  • 将 AutomationID 与 ListView 结合使用

    我正在尝试将 AutomationId 附加到列表视图中的项目 理想情况下 将项目名称绑定到显示的项目
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 与派生表的内连接

    我对连接派生表的基本语法有疑问 这是使用的基本语法吗 select from table1 a inner join select from table2 as T1 on 1 ID T1 ID 那行得通吗 您是在问加入两个子查询吗 尝试
  • 让 Windows 尝试读取文件

    我正在对 Windows 文件系统进行某种封装 当用户请求打开文件时 Windows 调用我的驱动程序来提供数据 在正常操作中 驱动程序返回缓存的文件内容 但是 在某些情况下 实际文件没有缓存 我需要从网络下载它 问题是是否有可能让 Win
  • 如何在 Hibernate 中使用 SELECT 进行 INSERT

    我需要在休眠中实现以下请求 insert into my table max column values select max id from special table where 如何在休眠中使用注释来做到这一点 Special tab
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 选择具有按两列分组的最大值的行

    我见过很多关于此类问题的解决方案 尤其是这个SQL 仅选择列上具有最大值的行 https stackoverflow com questions 7745609 sql select only rows with max value on

随机推荐

  • 通过 AT 命令终止语音通话

    我正在从事一个涉及 Arduino 和 TC35 GSM 模块的业余爱好项目 一切都很顺利 但我想知道是否有一个 AT 命令来终止语音通话 ATD 电话号码 因为我似乎无法在以下任何一个中找到一个我搜索过的文献 谢谢 戴夫 而 经典 命令A
  • 将 const 参数作为参数传递时出现隐秘错误消息

    所以我正在编写双向链表的实现 这是实现各个节点的类的构造函数 DNode DNode const int a key const DNode a prev const DNode a next key a key prev a prev n
  • 未捕获的 DOMException:无法在“存储”上执行“setItem”:设置“domains”的值超出了配额

    当我打开控制台时 每次在 Chrome 中都会显示此错误 未捕获的 DOMException 无法在 存储 上执行 setItem 设置 域名 的值超出了配额 在 HTMLScriptElement a onload https dl me
  • 在 Ruby 中如何调度对 instance_methods 的调用?

    instance methods被定义为公共实例方法Module班级 为什么以及如何我们能够调用Object instance methods 类方法调用的语法是什么 Because instance methods http www ru
  • 如何使用 Google Services Gradle 插件在 Circle CI 上测试 Android 应用程序

    我正在使用 Google Services Gradle 插件开发 Android 应用程序 Firebase 需要 并且该插件需要 google services json 我认为 json 文件不应该受到 git 的控制 因为它有一些应
  • d3js tree.nodes() 不是函数

    虽然下面的代码在 d3v3 中可以工作 但在 v4 中却失败了 var nodes tree nodes root reverse links tree links nodes 未捕获的类型错误 tree nodes 不是函数 v4 中它的
  • Stripe - 延迟市场应用程序中的传输

    我正在构建一个市场应用程序 我使用 Stripe 接受买家付款并将一定比例转给卖家 但是 条纹只能让您从条纹余额中转移 因此 如果我接受买家付款 且需要 2 个工作日才能显示在我的条带余额中 则我无法在销售发生时转移付款 我从 Stripe
  • 有没有办法在 CSS 中对齐多个表中的列?

    见下图 请注意 按日期分隔的两个表并未对齐 ZZ 列 XX 列和第三列 这是因为我们目前的实现方式是根据里面的文本改变列宽 我尝试使用固定宽度 但它在多个设备上看起来不太好 有没有办法我可以实现这个 以便 列是对齐的 无论内容如何 它都会通
  • Google REST API v3 - 修订:列表与“显示更详细的修订”

    我需要获取 Google 文档的修订的详细列表 使用 Google API Explorer 时 GET https www googleapis com drive v3 files fileId revisions 我只得到非详细列表
  • 开始检测活动以获得结果

    我有一项活动假设为 活动 A 我通过两种方式开始a StartActivity b StartActivityForResult 现在我有一些方法对于活动开始的方式有不同的行为 现在我想检测 活动 A 是否已启动以获得结果 那么我的问题是我
  • HTML5 历史 API 和书签

    如果 History API 创建的 URL 不是 真实 URL 那么使用 History API 有何意义 当然 我可以随心所欲地推送状态 但如果我不能将这些 URL 之一作为书签包含在某处 那还有什么意义呢 我真正的问题是 如何设置一个
  • 在 nextjs 中将 props 从一个页面传递到另一个页面

    我有一个虚拟项目 在我的项目中 我有两个页面 test1 和 test2 我想将一个道具从 page1 传递到 page2 我知道我可以使用 useRouter 钩子 但我不想将此道具设置为查询字符串 在我的 test1 页面中 我有一个颜
  • 使用 CRF 进行多元二元序列预测

    这个问题是一个延伸this one https stackoverflow com questions 53977695 multivariate binary sequence prediction with lstm其重点是 LSTM
  • Typescript Promise 拒绝和 vscode 调试器行为

    我正在尝试使用打字稿学习承诺 但我遇到了一些问题 无法理解导致此类 vscode 调试行为的原因 这是一个例子 example 1 new Promise resolve reject gt reject test1 debugger st
  • Lock.__enter__() 和 Condition.__enter__() 的文档

    我试图找到哪里 enter and exit Python 2 7 记录了线程化对象的方法 这主文档页面 https docs python org 2 7 library threading html condition objects关
  • 可以判断哪个工作簿调用了 Excel 加载项中的函数 (xla)

    我想在 Excel 加载项中编写一个小日志记录函数 我将从许多不同的工作簿中调用该函数 我希望能够通过仅传递日志文本来调用它 并且日志函数本身可以处理时间戳 工作簿名称 etc 但是 我无法使用 ThisWorkbook 或 ActiveW
  • 如何实现基于Python的四连棋检查胜负的功能?

    我正在编写一个 Connect 4 游戏 您可以在其中选择棋盘的大小 该游戏适用于大多数棋盘尺寸 但当棋盘比宽高时就会出现问题 我不断收到索引超出范围的错误 我不确定我做错了什么 这就是我现在的检查功能 因为它是唯一给我带来问题的部分 de
  • 如何获取 TensorFlow 数据集每个类的样本

    我正在使用 TensorFlow 数据集中的数据集 有没有一种简单的方法来访问数据集中每个类的样本数量 我正在搜索 keras api 但没有找到任何可以使用的函数 最终我想绘制一个条形图 其中 Y 轴为样本数 X 轴为 int 指示类 I
  • 计算剩余时间?

    我有一个这样生成的时间 SimpleDateFormat dateFormatUCT new SimpleDateFormat yyyy MM dd HH mm dateFormatUCT setTimeZone TimeZone getT
  • 使用 Castle ActiveRecord 插入多行并忽略任何重复的推荐方法

    我有一个 webmethod 可以将一堆菜谱插入到数据库的队列中 用于存储用户有兴趣烹饪的菜谱 类似于 NetFlix 的电影队列 用户可以一次检查一堆食谱并将其排队 我有类似这样的代码 WebMethod public void Enqu