如何防止再次使用参数
本文关键字:参数 何防止 | 更新日期: 2023-09-27 17:56:33
在此答案之后:
为什么这些哈希码相等?
我意识到GetHashCode的意图不是为对象提供唯一标识符。
这个测试的目的是我有一个具有 6 个参数的业务函数:
-
customerId
-
serviceId
-
startDate
-
EndDate
-
cmsThematicId
而且我不希望能够使用相同的值多次调用此函数
这些参数插入到数据库中,我可以使用(customerId = @customerId
和serviceId = @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:最初,历史记录表为空。对函数的每次调用将:
在 Hitory 表中查询与作为参数传递给函数的值匹配的现有值
如果需要,请填充"历史记录"表。
也就是说,函数要做的第一件事是查询 History 表,并(如果需要)在该表中插入一组新值。基本上,每次调用实现的函数时都会执行查询,因为查询是在该函数内完成的。