如何防止再次使用参数

本文关键字:参数 何防止 | 更新日期: 2023-09-27 17:56:33

在此答案之后:

为什么这些哈希码相等?

我意识到GetHashCode的意图不是为对象提供唯一标识符。

这个测试的目的是我有一个具有 6 个参数的业务函数:

  • customerId
  • serviceId
  • startDate
  • EndDate
  • cmsThematicId

而且我不希望能够使用相同的值多次调用此函数

这些参数插入到数据库中,我可以使用(customerId = @customerIdserviceId = @serviceId...)进行查询,但是我需要通过大量组合提高效率,因此这不是解决方案。

编辑:

例:

假设我有一个超级用户,他需要注册客户。注册由5个参数组成:customerId,serviceId,startDate,EndDate,cmsThematicId。注册的过程是这样的:

  • 您选择服务(例如"用一个大红色按钮显示嗨
  • ")
  • 您选择客户(购买服务的客户)
  • 您选择 cmsThematicId(如果需要,可以选择网页)
  • 选择开始日期(在下拉列表中)
  • 选择结束日期(在下拉列表中)

我的表单无法显示一组已使用的参数。

例如,一旦客户 1 注册了

1 月份"纽约假期"页面上的"大红色按钮"服务,超级用户将不会在表单中看到这些参数集。

所以我的过程是这样做的:- 创造所有的可能性- 在列表中计算每种可能性的哈希码- 获取每个已经使用的可能性的哈希码(从数据库)- 从列表中删除已使用的可能性- 显示表单

问题是:哈希码不是唯一的,所以即使没有使用,我也可能删除一个项目。

是不是更清楚了?

如何防止再次使用参数

每次调用后,将 6 个值存储在带有组合索引的历史记录表中。在您的业务函数中,我会添加一个代码来验证这些值是否已在您的历史记录表中,如果我找到这些值,请立即退出。

后期编辑:以下是查询"历史记录"表的方式:

IF EXISTS
  (SELECT customerId FROM HIstory WITH (NOLOCK) WHERE customerId='<value>' AND serviceId='<value>' AND <add all your fields here>)
    SELECT 1
ELSE
    SELECT 0

这样,如果已经有一条记录(意味着你的业务函数已经被你正在测试的参数调用过),上面的查询返回 1,否则返回 0。

所以如果 1,你需要停止。

如果为 0,则需要将值添加到历史记录表并执行业务逻辑。或者:执行业务逻辑,然后将值添加到历史记录表中。

编辑2:最初,历史记录表为空。对函数的每次调用将:

  1. 在 Hitory 表中查询与作为参数传递给函数的值匹配的现有值

  2. 如果需要,请填充"历史记录"表。

也就是说,函数要做的第一件事是查询 History 表,并(如果需要)在该表中插入一组新值。基本上,每次调用实现的函数时都会执行查询,因为查询是在该函数内完成的。