在这个答案之后:
Why are these hashcodes equals?
我意识到GetHashCode打算不为对象提供唯一标识符。
这个测试的目的是我有一个带有6个参数的业务功能:
customerId
serviceId
startDate
EndDate
cmsThematicId
我不希望能够使用相同的值多次调用此函数
这些参数被插入到数据库中,我可以使用(customerId = @customerId
和serviceId = @serviceId
...查询),但我需要通过大量组合来提高效率,因此这不是一个解决方案。
编辑:
示例:
假设我有一个超级用户需要注册客户。注册由5个参数组成:customerId,serviceId,startDate,EndDate,cmsThematicId。注册过程如下:
我的表单无法显示已使用的一组参数。
例如,一旦客户1在1月份的“纽约假期”页面上注册了服务“大红色按钮”,超级用户将不会在表单中看到这些参数集。
所以我的过程就这样做了: - 创造所有可能性 - 计算列表中每种可能性的哈希码 - 获取每个已使用的可能性的哈希码(来自数据库) - 从列表中删除已使用的可能性 - 显示表格
问题是:hashcode不是唯一的,所以我可能会删除一个项目,即使它没有被使用。
更清楚吗?
答案 0 :(得分:0)
每次调用后,将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,则需要将值添加到历史记录表并执行业务逻辑。或者:执行业务逻辑然后将值添加到历史表中。
<强> EDIT2:强> 最初,您的历史记录表为空。每次调用您的函数都将:
在Hitory表中查询与作为参数传递给函数的值匹配的现有值
如果需要,请填充历史记录表。
也就是说,您的函数首先要查询History表和(如果需要)在该表中插入一组新值。 基本上,每次调用您实现的函数时都会执行查询,因为查询是在该函数内完成的。