0

在这个答案之后:

为什么这些哈希码相等?

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

这个测试的目的是我有一个带有 6 个参数的业务功能:

  • customerId
  • serviceId
  • startDate
  • EndDate
  • cmsThematicId

而且我不想用相同的值多次调用这个函数

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

编辑 :

例子 :

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

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

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

例如,一旦客户 1 在 1 月份的“纽约假期”页面上注册了“大红色按钮”服务,超级用户将不会在表单中看到这些参数集。

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

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

更清楚了吗?

4

1 回答 1

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: 最初,您的历史记录表是空的。对您的函数的每次调用都将:

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

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

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

于 2013-01-30T09:01:29.347 回答