Почему Entity Framewok 6 прибегает к объединению и внешнему применению вместо соединений - PullRequest
0 голосов
/ 16 февраля 2020

Я запрашиваю свою таблицу Accounts и включаю несколько навигационных свойств:

var account = DBContext.Set<Account>()
            .Where(a => a.ID == accountID)
            .Include(a => a.AccountMembers)
            .Include(a => a.AccountMembers.Select(am => am.Person))
            .Include(a => a.AccountMembers.Select(am => am.Person.PersonPhones))
            .Include(a => a.AccountMembers.Select(am => am.Person.PersonEmailAddresses))
            .FirstOrDefault()

Account имеет 0 .. * AccountMembers, AccountMember имеет 1 Person, Person имеет 0 .. * PersonPhones и 0 .. * PersonEmails. Как видите, я пытаюсь включить все это для конкретного c Account. Запрос генерирует SQL, который использует inner и left joins, как я и ожидал, при включении только PersonPhones или PersonEmailAddresses, но как только я включаю оба, он выбирает AccountMembers, People, PersonPhones unioned с AccountMembers, People, PersonEmailAddresses и outer applys, что до Account.

SELECT 
    [Project4].[OnlineID] AS [OnlineID], 
    [Project4].[pk_AccountID] AS [pk_AccountID], 
    [Project4].[IsWaiverOnFile] AS [IsWaiverOnFile], 
    [Project4].[EmergencyDirectives] AS [EmergencyDirectives], 
    [Project4].[FirstMembershipDate] AS [FirstMembershipDate], 
    [Project4].[fk_FacilityID] AS [fk_FacilityID], 
    [Project4].[IsDeleted] AS [IsDeleted], 
    [Project4].[CreatedDate] AS [CreatedDate], 
    [Project4].[LastModifiedDate] AS [LastModifiedDate], 
    [Project4].[DoNotMail] AS [DoNotMail], 
    [Project4].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
    [Project4].[DoNotEmail] AS [DoNotEmail], 
    [Project4].[CreatedOnline] AS [CreatedOnline], 
    [Project4].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
    [Project4].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
    [Project4].[Comments] AS [Comments], 
    [Project4].[C38] AS [C1], 
    [Project4].[C2] AS [C2], 
    [Project4].[C3] AS [C3], 
    [Project4].[C4] AS [C4], 
    [Project4].[C5] AS [C5], 
    [Project4].[C6] AS [C6], 
    [Project4].[C7] AS [C7], 
    [Project4].[C8] AS [C8], 
    [Project4].[C9] AS [C9], 
    [Project4].[C10] AS [C10], 
    [Project4].[C11] AS [C11], 
    [Project4].[C12] AS [C12], 
    [Project4].[C13] AS [C13], 
    [Project4].[C14] AS [C14], 
    [Project4].[C15] AS [C15], 
    [Project4].[C16] AS [C16], 
    [Project4].[C17] AS [C17], 
    [Project4].[C18] AS [C18], 
    [Project4].[C19] AS [C19], 
    [Project4].[C20] AS [C20], 
    [Project4].[C1] AS [C21], 
    [Project4].[C21] AS [C22], 
    [Project4].[C22] AS [C23], 
    [Project4].[C23] AS [C24], 
    [Project4].[C24] AS [C25], 
    [Project4].[C25] AS [C26], 
    [Project4].[C26] AS [C27], 
    [Project4].[C27] AS [C28], 
    [Project4].[C28] AS [C29], 
    [Project4].[C29] AS [C30], 
    [Project4].[C30] AS [C31], 
    [Project4].[C31] AS [C32], 
    [Project4].[C32] AS [C33], 
    [Project4].[C33] AS [C34], 
    [Project4].[C34] AS [C35], 
    [Project4].[C35] AS [C36], 
    [Project4].[C36] AS [C37], 
    [Project4].[C37] AS [C38]
    FROM ( SELECT 
        [Limit1].[pk_AccountID] AS [pk_AccountID], 
        [Limit1].[OnlineID] AS [OnlineID], 
        [Limit1].[fk_FacilityID] AS [fk_FacilityID], 
        [Limit1].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
        [Limit1].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
        [Limit1].[FirstMembershipDate] AS [FirstMembershipDate], 
        [Limit1].[EmergencyDirectives] AS [EmergencyDirectives], 
        [Limit1].[IsWaiverOnFile] AS [IsWaiverOnFile], 
        [Limit1].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
        [Limit1].[DoNotMail] AS [DoNotMail], 
        [Limit1].[DoNotEmail] AS [DoNotEmail], 
        [Limit1].[CreatedDate] AS [CreatedDate], 
        [Limit1].[LastModifiedDate] AS [LastModifiedDate], 
        [Limit1].[CreatedOnline] AS [CreatedOnline], 
        [Limit1].[IsDeleted] AS [IsDeleted], 
        [Limit1].[Comments] AS [Comments], 
        [UnionAll1].[C1] AS [C1], 
        [UnionAll1].[C2] AS [C2], 
        [UnionAll1].[pk_AccountMemberID] AS [C3], 
        [UnionAll1].[fk_PersonID] AS [C4], 
        [UnionAll1].[fk_AccountID] AS [C5], 
        [UnionAll1].[CreatedDate] AS [C6], 
        [UnionAll1].[LastModifiedDate] AS [C7], 
        [UnionAll1].[fk_FacilityID] AS [C8], 
        [UnionAll1].[Relationship] AS [C9], 
        [UnionAll1].[IsPrimary] AS [C10], 
        [UnionAll1].[C3] AS [C11], 
        [UnionAll1].[pk_PersonID] AS [C12], 
        [UnionAll1].[FirstName] AS [C13], 
        [UnionAll1].[LastName] AS [C14], 
        [UnionAll1].[fk_AddressID] AS [C15], 
        [UnionAll1].[fk_FacilityID1] AS [C16], 
        [UnionAll1].[CreatedDate1] AS [C17], 
        [UnionAll1].[LastModifiedDate1] AS [C18], 
        [UnionAll1].[CreatedOnline] AS [C19], 
        [UnionAll1].[IsDeleted] AS [C20], 
        [UnionAll1].[pk_PersonPhoneID] AS [C21], 
        [UnionAll1].[fk_PhoneNumberID] AS [C22], 
        [UnionAll1].[fk_PhoneTypeID] AS [C23], 
        [UnionAll1].[IsDeleted1] AS [C24], 
        [UnionAll1].[CreatedDate2] AS [C25], 
        [UnionAll1].[LastModifiedDate2] AS [C26], 
        [UnionAll1].[fk_FacilityID2] AS [C27], 
        [UnionAll1].[fk_PersonID1] AS [C28], 
        [UnionAll1].[IsPrimary1] AS [C29], 
        [UnionAll1].[C4] AS [C30], 
        [UnionAll1].[C5] AS [C31], 
        [UnionAll1].[C6] AS [C32], 
        [UnionAll1].[C7] AS [C33], 
        [UnionAll1].[C8] AS [C34], 
        [UnionAll1].[C9] AS [C35], 
        [UnionAll1].[C10] AS [C36], 
        [UnionAll1].[C11] AS [C37], 
        CASE WHEN ([UnionAll1].[C2] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C38]
        FROM   (SELECT TOP (1) 
            [Extent1].[pk_AccountID] AS [pk_AccountID], 
            [Extent1].[OnlineID] AS [OnlineID], 
            [Extent1].[fk_FacilityID] AS [fk_FacilityID], 
            [Extent1].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
            [Extent1].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
            [Extent1].[FirstMembershipDate] AS [FirstMembershipDate], 
            [Extent1].[EmergencyDirectives] AS [EmergencyDirectives], 
            [Extent1].[IsWaiverOnFile] AS [IsWaiverOnFile], 
            [Extent1].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
            [Extent1].[DoNotMail] AS [DoNotMail], 
            [Extent1].[DoNotEmail] AS [DoNotEmail], 
            [Extent1].[CreatedDate] AS [CreatedDate], 
            [Extent1].[LastModifiedDate] AS [LastModifiedDate], 
            [Extent1].[CreatedOnline] AS [CreatedOnline], 
            [Extent1].[IsDeleted] AS [IsDeleted], 
            [Extent1].[Comments] AS [Comments]
            FROM [dbo].[Accounts] AS [Extent1]
            WHERE [Extent1].[pk_AccountID] = @p__linq__0 ) AS [Limit1]
        OUTER APPLY  (SELECT 
            CASE WHEN ([Extent4].[pk_PersonPhoneID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
            1 AS [C2], 
            [Extent2].[pk_AccountMemberID] AS [pk_AccountMemberID], 
            [Extent2].[fk_PersonID] AS [fk_PersonID], 
            [Extent2].[fk_AccountID] AS [fk_AccountID], 
            [Extent2].[CreatedDate] AS [CreatedDate], 
            [Extent2].[LastModifiedDate] AS [LastModifiedDate], 
            [Extent2].[fk_FacilityID] AS [fk_FacilityID], 
            [Extent2].[Relationship] AS [Relationship], 
            [Extent2].[IsPrimary] AS [IsPrimary], 
            1 AS [C3], 
            [Extent3].[pk_PersonID] AS [pk_PersonID], 
            [Extent3].[FirstName] AS [FirstName], 
            [Extent3].[LastName] AS [LastName], 
            [Extent3].[fk_AddressID] AS [fk_AddressID], 
            [Extent3].[fk_FacilityID] AS [fk_FacilityID1], 
            [Extent3].[CreatedDate] AS [CreatedDate1], 
            [Extent3].[LastModifiedDate] AS [LastModifiedDate1], 
            [Extent3].[CreatedOnline] AS [CreatedOnline], 
            [Extent3].[IsDeleted] AS [IsDeleted], 
            [Extent4].[pk_PersonPhoneID] AS [pk_PersonPhoneID], 
            [Extent4].[fk_PhoneNumberID] AS [fk_PhoneNumberID], 
            [Extent4].[fk_PhoneTypeID] AS [fk_PhoneTypeID], 
            [Extent4].[IsDeleted] AS [IsDeleted1], 
            [Extent4].[CreatedDate] AS [CreatedDate2], 
            [Extent4].[LastModifiedDate] AS [LastModifiedDate2], 
            [Extent4].[fk_FacilityID] AS [fk_FacilityID2], 
            [Extent4].[fk_PersonID] AS [fk_PersonID1], 
            [Extent4].[IsPrimary] AS [IsPrimary1], 
            CAST(NULL AS uniqueidentifier) AS [C4], 
            CAST(NULL AS uniqueidentifier) AS [C5], 
            CAST(NULL AS uniqueidentifier) AS [C6], 
            CAST(NULL AS bit) AS [C7], 
            CAST(NULL AS datetime2) AS [C8], 
            CAST(NULL AS datetime2) AS [C9], 
            CAST(NULL AS uniqueidentifier) AS [C10], 
            CAST(NULL AS bit) AS [C11]
            FROM   [dbo].[AccountMembers] AS [Extent2]
            INNER JOIN [dbo].[People] AS [Extent3] ON [Extent2].[fk_PersonID] = [Extent3].[pk_PersonID]
            LEFT OUTER JOIN [dbo].[PersonPhones] AS [Extent4] ON [Extent4].[fk_PersonID] = [Extent2].[fk_PersonID]
            WHERE [Limit1].[pk_AccountID] = [Extent2].[fk_AccountID]
        UNION ALL
            SELECT 
            2 AS [C1], 
            2 AS [C2], 
            [Extent5].[pk_AccountMemberID] AS [pk_AccountMemberID], 
            [Extent5].[fk_PersonID] AS [fk_PersonID], 
            [Extent5].[fk_AccountID] AS [fk_AccountID], 
            [Extent5].[CreatedDate] AS [CreatedDate], 
            [Extent5].[LastModifiedDate] AS [LastModifiedDate], 
            [Extent5].[fk_FacilityID] AS [fk_FacilityID], 
            [Extent5].[Relationship] AS [Relationship], 
            [Extent5].[IsPrimary] AS [IsPrimary], 
            2 AS [C3], 
            [Extent6].[pk_PersonID] AS [pk_PersonID], 
            [Extent6].[FirstName] AS [FirstName], 
            [Extent6].[LastName] AS [LastName], 
            [Extent6].[fk_AddressID] AS [fk_AddressID], 
            [Extent6].[fk_FacilityID] AS [fk_FacilityID1], 
            [Extent6].[CreatedDate] AS [CreatedDate1], 
            [Extent6].[LastModifiedDate] AS [LastModifiedDate1], 
            [Extent6].[CreatedOnline] AS [CreatedOnline], 
            [Extent6].[IsDeleted] AS [IsDeleted], 
            CAST(NULL AS uniqueidentifier) AS [C4], 
            CAST(NULL AS uniqueidentifier) AS [C5], 
            CAST(NULL AS uniqueidentifier) AS [C6], 
            CAST(NULL AS bit) AS [C7], 
            CAST(NULL AS datetime2) AS [C8], 
            CAST(NULL AS datetime2) AS [C9], 
            CAST(NULL AS uniqueidentifier) AS [C10], 
            CAST(NULL AS uniqueidentifier) AS [C11], 
            CAST(NULL AS bit) AS [C12], 
            [Extent7].[pk_PersonEmailAddressID] AS [pk_PersonEmailAddressID], 
            [Extent7].[fk_PersonID] AS [fk_PersonID1], 
            [Extent7].[fk_EmailAddressID] AS [fk_EmailAddressID], 
            [Extent7].[IsDeleted] AS [IsDeleted1], 
            [Extent7].[CreatedDate] AS [CreatedDate2], 
            [Extent7].[LastModifiedDate] AS [LastModifiedDate2], 
            [Extent7].[fk_FacilityID] AS [fk_FacilityID2], 
            [Extent7].[IsPrimary] AS [IsPrimary1]
            FROM   [dbo].[AccountMembers] AS [Extent5]
            INNER JOIN [dbo].[People] AS [Extent6] ON [Extent5].[fk_PersonID] = [Extent6].[pk_PersonID]
            INNER JOIN [dbo].[PersonEmailAddresses] AS [Extent7] ON ([Extent5].[fk_PersonID] = [Extent6].[pk_PersonID]) AND ([Extent7].[fk_PersonID] = [Extent6].[pk_PersonID])
            WHERE [Limit1].[pk_AccountID] = [Extent5].[fk_AccountID]) AS [UnionAll1]
    )  AS [Project4]
    ORDER BY [Project4].[pk_AccountID] ASC, [Project4].[C38] ASC, [Project4].[C3] ASC, [Project4].[C12] ASC, [Project4].[C1] ASC

Почему он переключается на эту структуру запроса, когда кажется, что он может продолжать использовать объединения, как написано здесь:

SELECT      *
FROM        Accounts a
LEFT JOIN   (AccountMembers am
             INNER JOIN (People p 
                         LEFT JOIN PersonPhones pp ON p.pk_PersonID = pp.fk_PersonID
                         LEFT JOIN PersonEmailAddresses pe ON p.pk_personID = pe.fk_PersonID
                        ) ON am.fk_PersonID = p.pk_PersonID
            ) ON am.fk_AccountID = a.pk_AccountID
WHERE       a.pk_AccountID = @accountID

Кажется, у этого более простой план выполнения, потому что он LEFT JOINS PersonPhones и PersonEmailAddresses в одном и том же People "экземпляре", а не объединять их в два отдельных unioned запроса. SELECT TOP (1) из Accounts также кажется ненужным, когда он выбирает указанный первичный ключ c.

Можно ли написать запрос LINQ для использования таких объединений или я пропускаю необходимость? для более сложной версии он генерирует? Это база данных SQL Server 2016.

PS Вот что она генерирует, если я опускаю включение PersonEmailAddresses:

SELECT 
    [Project2].[OnlineID] AS [OnlineID], 
    [Project2].[pk_AccountID] AS [pk_AccountID], 
    [Project2].[IsWaiverOnFile] AS [IsWaiverOnFile], 
    [Project2].[EmergencyDirectives] AS [EmergencyDirectives], 
    [Project2].[FirstMembershipDate] AS [FirstMembershipDate], 
    [Project2].[fk_FacilityID] AS [fk_FacilityID], 
    [Project2].[IsDeleted] AS [IsDeleted], 
    [Project2].[CreatedDate] AS [CreatedDate], 
    [Project2].[LastModifiedDate] AS [LastModifiedDate], 
    [Project2].[DoNotMail] AS [DoNotMail], 
    [Project2].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
    [Project2].[DoNotEmail] AS [DoNotEmail], 
    [Project2].[CreatedOnline] AS [CreatedOnline], 
    [Project2].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
    [Project2].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
    [Project2].[Comments] AS [Comments], 
    [Project2].[C3] AS [C1], 
    [Project2].[C1] AS [C2], 
    [Project2].[pk_AccountMemberID] AS [pk_AccountMemberID], 
    [Project2].[fk_PersonID] AS [fk_PersonID], 
    [Project2].[fk_AccountID] AS [fk_AccountID], 
    [Project2].[CreatedDate1] AS [CreatedDate1], 
    [Project2].[LastModifiedDate1] AS [LastModifiedDate1], 
    [Project2].[fk_FacilityID1] AS [fk_FacilityID1], 
    [Project2].[Relationship] AS [Relationship], 
    [Project2].[IsPrimary] AS [IsPrimary], 
    [Project2].[pk_PersonID] AS [pk_PersonID], 
    [Project2].[FirstName] AS [FirstName], 
    [Project2].[LastName] AS [LastName], 
    [Project2].[fk_AddressID] AS [fk_AddressID], 
    [Project2].[fk_FacilityID2] AS [fk_FacilityID2], 
    [Project2].[CreatedDate2] AS [CreatedDate2], 
    [Project2].[LastModifiedDate2] AS [LastModifiedDate2], 
    [Project2].[CreatedOnline1] AS [CreatedOnline1], 
    [Project2].[IsDeleted1] AS [IsDeleted1], 
    [Project2].[C2] AS [C3], 
    [Project2].[pk_PersonPhoneID] AS [pk_PersonPhoneID], 
    [Project2].[fk_PhoneNumberID] AS [fk_PhoneNumberID], 
    [Project2].[fk_PhoneTypeID] AS [fk_PhoneTypeID], 
    [Project2].[IsDeleted2] AS [IsDeleted2], 
    [Project2].[CreatedDate3] AS [CreatedDate3], 
    [Project2].[LastModifiedDate3] AS [LastModifiedDate3], 
    [Project2].[fk_FacilityID3] AS [fk_FacilityID3], 
    [Project2].[fk_PersonID1] AS [fk_PersonID1], 
    [Project2].[IsPrimary1] AS [IsPrimary1]
    FROM ( SELECT 
        [Limit1].[pk_AccountID] AS [pk_AccountID], 
        [Limit1].[OnlineID] AS [OnlineID], 
        [Limit1].[fk_FacilityID] AS [fk_FacilityID], 
        [Limit1].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
        [Limit1].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
        [Limit1].[FirstMembershipDate] AS [FirstMembershipDate], 
        [Limit1].[EmergencyDirectives] AS [EmergencyDirectives], 
        [Limit1].[IsWaiverOnFile] AS [IsWaiverOnFile], 
        [Limit1].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
        [Limit1].[DoNotMail] AS [DoNotMail], 
        [Limit1].[DoNotEmail] AS [DoNotEmail], 
        [Limit1].[CreatedDate] AS [CreatedDate], 
        [Limit1].[LastModifiedDate] AS [LastModifiedDate], 
        [Limit1].[CreatedOnline] AS [CreatedOnline], 
        [Limit1].[IsDeleted] AS [IsDeleted], 
        [Limit1].[Comments] AS [Comments], 
        [Join2].[pk_AccountMemberID] AS [pk_AccountMemberID], 
        [Join2].[fk_PersonID1] AS [fk_PersonID], 
        [Join2].[fk_AccountID] AS [fk_AccountID], 
        [Join2].[CreatedDate1] AS [CreatedDate1], 
        [Join2].[LastModifiedDate1] AS [LastModifiedDate1], 
        [Join2].[fk_FacilityID1] AS [fk_FacilityID1], 
        [Join2].[Relationship] AS [Relationship], 
        [Join2].[IsPrimary1] AS [IsPrimary], 
        [Join2].[pk_PersonID] AS [pk_PersonID], 
        [Join2].[FirstName] AS [FirstName], 
        [Join2].[LastName] AS [LastName], 
        [Join2].[fk_AddressID] AS [fk_AddressID], 
        [Join2].[fk_FacilityID2] AS [fk_FacilityID2], 
        [Join2].[CreatedDate2] AS [CreatedDate2], 
        [Join2].[LastModifiedDate2] AS [LastModifiedDate2], 
        [Join2].[CreatedOnline] AS [CreatedOnline1], 
        [Join2].[IsDeleted1] AS [IsDeleted1], 
        CASE WHEN ([Join2].[pk_AccountMemberID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1], 
        [Join2].[pk_PersonPhoneID] AS [pk_PersonPhoneID], 
        [Join2].[fk_PersonID2] AS [fk_PersonID1], 
        [Join2].[fk_PhoneNumberID] AS [fk_PhoneNumberID], 
        [Join2].[fk_PhoneTypeID] AS [fk_PhoneTypeID], 
        [Join2].[IsDeleted2] AS [IsDeleted2], 
        [Join2].[CreatedDate3] AS [CreatedDate3], 
        [Join2].[LastModifiedDate3] AS [LastModifiedDate3], 
        [Join2].[fk_FacilityID3] AS [fk_FacilityID3], 
        [Join2].[IsPrimary2] AS [IsPrimary1], 
        CASE WHEN ([Join2].[pk_AccountMemberID] IS NULL) THEN CAST(NULL AS int) WHEN ([Join2].[pk_PersonPhoneID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2], 
        CASE WHEN ([Join2].[pk_AccountMemberID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C3]
        FROM   (SELECT TOP (1) 
            [Extent1].[pk_AccountID] AS [pk_AccountID], 
            [Extent1].[OnlineID] AS [OnlineID], 
            [Extent1].[fk_FacilityID] AS [fk_FacilityID], 
            [Extent1].[fk_OriginalInquiryID] AS [fk_OriginalInquiryID], 
            [Extent1].[fk_ReferringAccountID] AS [fk_ReferringAccountID], 
            [Extent1].[FirstMembershipDate] AS [FirstMembershipDate], 
            [Extent1].[EmergencyDirectives] AS [EmergencyDirectives], 
            [Extent1].[IsWaiverOnFile] AS [IsWaiverOnFile], 
            [Extent1].[IsMediaReleaseOnFile] AS [IsMediaReleaseOnFile], 
            [Extent1].[DoNotMail] AS [DoNotMail], 
            [Extent1].[DoNotEmail] AS [DoNotEmail], 
            [Extent1].[CreatedDate] AS [CreatedDate], 
            [Extent1].[LastModifiedDate] AS [LastModifiedDate], 
            [Extent1].[CreatedOnline] AS [CreatedOnline], 
            [Extent1].[IsDeleted] AS [IsDeleted], 
            [Extent1].[Comments] AS [Comments]
            FROM [dbo].[Accounts] AS [Extent1]
            WHERE [Extent1].[pk_AccountID] = @p__linq__0 ) AS [Limit1]
        LEFT OUTER JOIN  (SELECT [Extent2].[pk_AccountMemberID] AS [pk_AccountMemberID], [Extent2].[fk_PersonID] AS [fk_PersonID1], [Extent2].[fk_AccountID] AS [fk_AccountID], [Extent2].[CreatedDate] AS [CreatedDate1], [Extent2].[LastModifiedDate] AS [LastModifiedDate1], [Extent2].[fk_FacilityID] AS [fk_FacilityID1], [Extent2].[Relationship] AS [Relationship], [Extent2].[IsPrimary] AS [IsPrimary1], [Extent3].[pk_PersonID] AS [pk_PersonID], [Extent3].[FirstName] AS [FirstName], [Extent3].[LastName] AS [LastName], [Extent3].[fk_AddressID] AS [fk_AddressID], [Extent3].[fk_FacilityID] AS [fk_FacilityID2], [Extent3].[CreatedDate] AS [CreatedDate2], [Extent3].[LastModifiedDate] AS [LastModifiedDate2], [Extent3].[CreatedOnline] AS [CreatedOnline], [Extent3].[IsDeleted] AS [IsDeleted1], [Extent4].[pk_PersonPhoneID] AS [pk_PersonPhoneID], [Extent4].[fk_PersonID] AS [fk_PersonID2], [Extent4].[fk_PhoneNumberID] AS [fk_PhoneNumberID], [Extent4].[fk_PhoneTypeID] AS [fk_PhoneTypeID], [Extent4].[IsDeleted] AS [IsDeleted2], [Extent4].[CreatedDate] AS [CreatedDate3], [Extent4].[LastModifiedDate] AS [LastModifiedDate3], [Extent4].[fk_FacilityID] AS [fk_FacilityID3], [Extent4].[IsPrimary] AS [IsPrimary2]
            FROM   [dbo].[AccountMembers] AS [Extent2]
            INNER JOIN [dbo].[People] AS [Extent3] ON [Extent2].[fk_PersonID] = [Extent3].[pk_PersonID]
            LEFT OUTER JOIN [dbo].[PersonPhones] AS [Extent4] ON [Extent4].[fk_PersonID] = [Extent2].[fk_PersonID] ) AS [Join2] ON [Limit1].[pk_AccountID] = [Join2].[fk_AccountID]
    )  AS [Project2]
    ORDER BY [Project2].[pk_AccountID] ASC, [Project2].[C3] ASC, [Project2].[pk_AccountMemberID] ASC, [Project2].[pk_PersonID] ASC, [Project2].[C2] ASCa
...