0

この回答の後:

これらのハッシュコードが等しいのはなぜですか?

GetHashCode の意図は、オブジェクトに一意の識別子を提供することではないことに気付きました。

このテストの目的は、6 つのパラメーターを持つビジネス関数を用意することでした。

  • customerId
  • serviceId
  • startDate
  • EndDate
  • cmsThematicId

そして、同じ値でこの関数を複数回呼び出すことはしたくありません

これらのパラメーターはデータベースに挿入され、(customerId = @customerIdおよびserviceId = @serviceId...) でクエリを実行できますが、多くの組み合わせで効率的にする必要があるため、これは解決策ではありません。

編集 :

例 :

顧客を登録する必要があるスーパーユーザーがいるとしましょう。登録は、customerId、serviceId、startDate、EndDate、cmsThematicId の 5 つのパラメーターで行われます。登録のプロセスは次のようになります。

  • サービスを選択します(たとえば、「大きな赤いボタンでこんにちはを表示」)
  • 顧客(サービスを購入した人)を選択します
  • cmsThematicId (必要に応じて Web ページ) を選択します。
  • startDate を選択します (ドロップダウン リストで)
  • endDate を選択します (ドロップダウン リストで)

既に使用されている一連のパラメーターをフォームに表示できません。

たとえば、顧客 1 が「ニューヨークの祝日」ページの「大きな赤いボタン」というサービスに 1 月に登録されると、スーパー ユーザーにはこれらのパラメータ セットがフォームに表示されなくなります。

だから私のプロセスはこれをしました:

問題は、ハッシュコードが一意ではないため、使用されていなくてもアイテムを削除する可能性があることです。

より明確ですか?

4

1 に答える 1

0

各呼び出しの後、構成されたインデックスを使用して履歴テーブルに 6 つの値を保存します。ビジネス関数に、これらの値が既に履歴テーブルにあるかどうかを確認するコードを追加し、それらの値が見つかった場合はすぐに終了します。

LATER EDIT:これは履歴テーブルを照会する方法です:

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. 関数にパラメーターとして渡された値と一致する既存の値について、History テーブルをクエリします。

  2. 必要に応じて履歴テーブルにデータを入力します。

つまり、関数が最初に実行することは、履歴テーブルをクエリし、(必要に応じて) そのテーブルに新しい値のセットを挿入することです。基本的に、クエリはその関数内で実行されるため、実装した関数を呼び出すたびにクエリが実行されます。

于 2013-01-30T09:01:29.347 に答える