热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#-解决从数据库中筛选未使用ID的问题

本文探讨了如何在C#应用程序中有效处理来自两个不同数据库的数据,特别是当需要从一个数据库中选择不在另一个大型集合中的ID时遇到的挑战和解决方案。

在构建涉及两个独立数据库的应用时,遇到了一个特定的需求:需要从一个数据库中获取一组ID,这些ID不在另一个数据库的某个表中出现。具体来说,我有一个称为Permit的对象,该对象包含一个ID列表,这些ID引用了另一个数据库中的任务记录。

尝试实现这一需求时,我使用了如下的SQL查询:

var listOfUsedIds = select taskid from Permit_Task;
Select * from task where id not in (listOfUsedIds)

然而,这段代码执行时抛出了一个错误,指出RPC请求中提供的参数过多,超过了2100个的最大限制。

由于NHibernate框架的限制,我不能直接在两个数据库之间执行这样的查询。面对这一挑战,我探索了几种可能的解决方案。

首先,可以通过创建临时表来绕过参数数量的限制。具体步骤如下:

using (var tx = session.BeginTransaction())
{
session.CreateSQLQuery("CREATE TEMP TABLE usedIds (id INT)").ExecuteUpdate();
foreach (var id in ids)
{
session.CreateSQLQuery("INSERT INTO usedIds VALUES (:id)")
.SetParameter("id", id)
.ExecuteUpdate();
}
session.CreateSQLQuery("CREATE INDEX usedIds_idx ON usedIds (id)").ExecuteUpdate();
var batchSize = 1000;
int offset = 0;
bool hasMoreResults = true;
while (hasMoreResults)
{
var results = session.CreateSQLQuery("SELECT id FROM tasks WHERE id NOT IN (SELECT id FROM usedIds) LIMIT @batchSize OFFSET @offset")
.SetInt32("batchSize", batchSize)
.SetInt32("offset", offset)
.List();
if (results.Count > 0)
{
// 处理结果
offset += results.Count;
}
else
{
hasMoreResults = false;
}
}
tx.Commit();
}

此外,还可以通过映射属性的方法来间接实现目标。例如,可以在实体映射中定义一个计算属性,用于检查某个ID是否存在于临时表中:

public TaskMap()
{
Map(x => x.IsUsed).Formula("(SELECT COUNT(*) FROM usedIds u WHERE u.Id = Id)").LazyLoad();
}
var tasks = session.QueryOver()
.Where(t => t.IsUsed == 0)
.List();

以上两种方法均可有效解决原始问题,同时避免了参数数量限制的问题。希望这些解决方案能为面临类似问题的开发者提供帮助。


推荐阅读
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
author-avatar
mobiledu2502891563
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有