1

私は常に、既存のクエリに相当する LINQ to SQL は Any() を使用することだと考えていました。しかし、私は最近 LINQ でクエリを作成しました。これは基本的に、単一のテーブルに重複レコードが存在するかどうかを見つけようとしています。

どれでもcontext.Contacts.Any(c => ((c.FirstName == contact.FirstName && c.LastName == contact.LastName && c.AddressLine1 == contact.AddressLine1 && c.Zip == contact.Zip)|| (!String.IsNullOrEmpty(contact.Email) && c.Email == contact.Email)))

一致基準は、同じ FirstName、LastName、および AddressLine1 または同じ Email を持つ連絡先を簡単に見つけることができます。このクエリは 30 秒 (デフォルト) でタイムアウトになり、このテーブルには 500K 行しかありません。

どこcontext.Contacts.Where(c => ((c.FirstName == contact.FirstName && c.LastName == contact.LastName && c.AddressLine1 == contact.AddressLine1 && c.Zip == contact.Zip)|| (!String.IsNullOrEmpty(contact.Email) && c.Email == contact.Email))).Count()>0

Where 句を使用することを余儀なくされた後、セットに重複が存在するかどうかを確認するために 0 より大きいカウントを行います。私が理解できないのは、単純な Any 句で LINQ to SQL がタイムアウトする理由です。ここでの説明は本当に素晴らしいでしょう。

編集

SQL From LINQ Pad ANY から

SELECT 
(CASE 
    WHEN EXISTS(
        SELECT NULL AS [EMPTY]
        FROM [Accounts].[Contacts] AS [t0]
        WHERE ([t0].[CompanyID] = @p0) AND ((([t0].[FirstName] = @p1) AND ([t0].[LastName] = @p2) AND ([t0].[AddressLine1] = @p3) AND ([t0].[Zip] = @p4)) OR (([t0].[FirstName] = @p5) AND ([t0].[LastName] = @p6) AND (EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [Accounts].[PhoneNumbers] AS [t1]
            WHERE ([t1].[ContactNumber] = @p7) AND ([t1].[ContactID] = [t0].[ContactID])
            ))))
        ) THEN 1
    ELSE 0
 END) AS [value]

どこ

SELECT [t0].[ContactID]
    ,[t0].[CompanyID]
    ,[t0].[CompanyTitle]
    ,[t0].[FirstName]
    ,[t0].[LastName]
    ,[t0].[AddressLine1]
    ,[t0].[AddressLine2]
    ,[t0].[City]
    ,[t0].[State]
    ,[t0].[Zip]
    ,[t0].[Email]
    ,[t0].[Salutation]
    ,[t0].[IsActive]
FROM [Accounts].[Contacts] AS [t0]
WHERE ([t0].[CompanyID] = @p0)
    AND (
        (
            ([t0].[FirstName] = @p1)
            AND ([t0].[LastName] = @p2)
            AND ([t0].[AddressLine1] = @p3)
            AND ([t0].[Zip] = @p4)
            )
        OR (
            ([t0].[FirstName] = @p5)
            AND ([t0].[LastName] = @p6)
            AND (
                EXISTS (
                    SELECT NULL AS [EMPTY]
                    FROM [Accounts].[PhoneNumbers] AS [t1]
                    WHERE ([t1].[ContactNumber] = @p7)
                        AND ([t1].[ContactID] = [t0].[ContactID])
                    )
                )
            )
        )
4

1 に答える 1