0

私のデータベースには、、、などのようなテーブルがありますCustomer。これらMemberの各ユーザーには、自分の電子メールアドレスがあります。指定された電子メールを持つユーザーがすでに存在するかどうかを確認する必要があります。私は考えていました:InstructorEmployee

  • 次のような各テーブルを確認してください。
    public bool IsEmailAddressExists(string email)
    {
        if (!Context.Customers.Any(c => string.Equals(c.Email, email, StringComparison.InvariantCultureIgnoreCase)))
            if (!Context.Members.Any(m => string.Equals(m.Email, email, StringComparison.InvariantCultureIgnoreCase)))
              ...
    }
  • すべてのメールを選択して確認してください。
    public bool IsEmailAddressExists(string email)
    {
        var emails = Context.Customers.Select(c => c.Email).Union(Context.Members.Select(m => m.Email))...; //other unions
        return emails.Any(e => string.Equals(e, email, StringComparison.InvariantCultureIgnoreCase));
    }

より多くのテーブルと多くのユーザーがいるので、そのような種類のチェックを実装するための最も効率的な方法は何であるかを知りたいです。

ありがとうございました。

4

2 に答える 2

5

いくつかの選択肢があるようです。

ビューを作成します。 たとえば、電子メールアドレスのみを表示するビューをデータベースに作成できます。MSSQL Serverを使用しているとすると、次のようになります。

CREATE VIEW EmailView AS
SELECT Email from Customers
UNION ALL
SELECT Email from Instructors
....

...次に、そのビューにバインドされたエンティティを使用して、電子メールのリストをチェックして、その電子メールがすでに存在するかどうかを確認できます。詳細については、ドキュメントを確認してください。

データベースを正規化します。 これらの各テーブルは、電子メール以外の共通の情報、たとえば、名や姓を共有していますか?データモデルを再編成してその情報を「Persons」テーブルに配置し、他のテーブルに外部キーを設定することは、時間をかける価値があるかもしれません。(これは、ユーザーが2つの異なるもの、たとえば顧客とインストラクターである場合にも役立ちます。)

于 2012-06-14T14:47:27.297 に答える
1

純粋な SQL では、一致するとすぐに検索を停止するため、これが最も効率的です。

... ストアド プロシージャとして:

CREATE PROCEDURE EmailExists 
    @email varchar(254) = NULL
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @emailExists bit

    SET @emailExists = 0

    SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Customer WHERE email = @email)
    IF @emailExists = 0
    BEGIN
        SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Member WHERE email = @email)
        IF @emailExists = 0
        BEGIN
            SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Instructor WHERE email = @email)
            IF @emailExists = 0
            BEGIN
                SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Employee WHERE email = @email)
            END
        END
    END

    SELECT @emailExists
END

... スカラー値関数として:

CREATE FUNCTION EmailExists 
(
    @email varchar(254)
)
RETURNS bit
AS
BEGIN
    DECLARE @emailExists bit

    SET @emailExists = 0

    SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Customer WHERE email = @email)
    IF @emailExists = 0
    BEGIN
        SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Member WHERE email = @email)
        IF @emailExists = 0
        BEGIN
            SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Instructor WHERE email = @email)
            IF @emailExists = 0
            BEGIN
                SELECT @emailExists = 1 WHERE EXISTS(SELECT 1 FROM Employee WHERE email = @email)
            END
        END
    END

    -- Return the result of the function
    RETURN @emailExists
END

Linq を使用した C# では、Any 拡張子と || を使用できます。オペレーター。Any は通常、SQL で EXISTS に変換され、|| の評価が行われるためです。C# の演算子は怠惰なため、電子メールの最初の発生に達するとすぐに評価が停止します。

bool emailExists = customerEmails.Any(e => string.Equals(e, email, StringComparison.InvariantCultureIgnoreCase))
                   || memberEmails.Any(e => string.Equals(e, email, StringComparison.InvariantCultureIgnoreCase))
                   || instructorEmails.Any(e => string.Equals(e, email, StringComparison.InvariantCultureIgnoreCase))
                   || employeeEmails.Any(e => string.Equals(e, email, StringComparison.InvariantCultureIgnoreCase));
于 2012-06-14T17:31:40.510 に答える