我有一个表Requester,它有五个外键到地址表:
CREATE TABLE [dbo].[Requester](
[Id] [int] NOT NULL,
[FirstName] [nvarchar](64) NULL,
[Surname] [nvarchar](64) NOT NULL,
[**RegisteredAddress**] [int] NULL,
[**MailingAddress**] [int] NULL,
[**ResidenceAddress**] [int] NULL,
[**CompanySeatAddress**] [int] NULL,
[**WorkplaceAddress**] [int] NULL,
)
地址是一个简单的表
CREATE TABLE [dbo].[Address](
[Id] [int] IDENTITY(1,1) NOT NULL,
[AddressLine1] [nvarchar](64) NOT NULL,
[AddressLine2] [nvarchar](64) NULL,
[ZipCode] [varchar](6) NOT NULL,
[Post] [nvarchar](64) NOT NULL,
)
我的EF Code First mappping看起来像
modelBuilder.Entity<Requester>()
.HasOptional(a => a.RegisteredAddress).WithOptionalDependent().Map(x => x.MapKey("RegisteredAddress"));
modelBuilder.Entity<Requester>()
.HasOptional(a => a.ResidenceAddress).WithOptionalDependent().Map(x => x.MapKey("ResidenceAddress"));
modelBuilder.Entity<Requester>()
.HasOptional(a => a.MailingAddress).WithOptionalDependent().Map(x => x.MapKey("MailingAddress"));
modelBuilder.Entity<Requester>()
.HasOptional(a => a.CompanySeatAddress).WithOptionalDependent().Map(x => x.MapKey("CompanySeatAddress"));
modelBuilder.Entity<Requester>()
.HasOptional(a => a.WorkplaceAddress).WithOptionalDependent().Map(x => x.MapKey("WorkplaceAddress"));
当我尝试使用预先加载进行查询时:
var requesters = (from x in _context.Requester.Include(x => x.MailingAddress)
.Include(x => x.ResidenceAddress)
.Include(x => x.RegisteredAddress)
.Include(x => x.WorkplaceAddress)
select x).ToList();
生成了一个效率很低的t-sql。
有人可以建议如何优化这个吗?
SELECT [Extent1].[Id] AS [Id],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Surname] AS [Surname],
[Join5].[Id1] AS [Id1],
[Join5].[AddressLine1] AS [AddressLine1],
[Join5].[AddressLine2] AS [AddressLine2],
[Join5].[ZipCode] AS [ZipCode],
[Join5].[Post] AS [Post],
[Join11].[Id2] AS [Id2],
[Join17].[Id3] AS [Id3],
[Join23].[Id4] AS [Id4],
[Join29].[Id5] AS [Id5],
[Join35].[Id6] AS [Id6],
[Join41].[Id7] AS [Id7],
[Join41].[AddressLine1] AS [AddressLine11],
[Join41].[AddressLine2] AS [AddressLine21],
[Join41].[ZipCode] AS [ZipCode1],
[Join41].[Post] AS [Post1],
[Join47].[Id8] AS [Id8],
[Join53].[Id9] AS [Id9],
[Join59].[Id10] AS [Id10],
[Join65].[Id11] AS [Id11],
[Join71].[Id12] AS [Id12],
[Join77].[Id13] AS [Id13],
[Join77].[AddressLine1] AS [AddressLine12],
[Join77].[AddressLine2] AS [AddressLine22],
[Join77].[ZipCode] AS [ZipCode2],
[Join77].[Post] AS [Post2],
[Join83].[Id14] AS [Id14],
[Join89].[Id15] AS [Id15],
[Join95].[Id16] AS [Id16],
[Join101].[Id17] AS [Id17],
[Join107].[Id18] AS [Id18],
[Join112].[Id19] AS [Id19],
[Join112].[AddressLine1] AS [AddressLine13],
[Join112].[AddressLine2] AS [AddressLine23],
[Join112].[ZipCode] AS [ZipCode3],
[Join112].[Post] AS [Post3],
[Join117].[Id20] AS [Id20],
[Join122].[Id21] AS [Id21],
[Join127].[Id22] AS [Id22],
[Join132].[Id23] AS [Id23],
[Extent1].[CompanySeatAddress] AS [CompanySeatAddress]
FROM [dbo].[Requester] AS [Extent1]
LEFT JOIN (
SELECT [Extent2].[Id] AS [Id1],
[Extent2].[AddressLine1] AS [AddressLine1],
[Extent2].[AddressLine2] AS [AddressLine2],
[Extent2].[ZipCode] AS [ZipCode],
[Extent2].[Post] AS [Post],
[Extent5].[Id] AS [Id24]
FROM [dbo].[Address] AS [Extent2]
LEFT JOIN [dbo].[Requester] AS [Extent3] ON ([Extent2].[Id] = [Extent3].[RegisteredAddress])
AND ([Extent3].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent4] ON ([Extent2].[Id] = [Extent4].[ResidenceAddress])
AND ([Extent4].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent5] ON ([Extent2].[Id] = [Extent5].[MailingAddress])
AND ([Extent5].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent6] ON ([Extent2].[Id] = [Extent6].[CompanySeatAddress])
AND ([Extent6].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent7] ON ([Extent2].[Id] = [Extent7].[WorkplaceAddress])
AND ([Extent7].[WorkplaceAddress] IS NOT NULL)
) AS [Join5] ON [Extent1].[Id] = [Join5].[Id24]
LEFT JOIN (
SELECT [Extent9].[Id] AS [Id2],
[Extent11].[Id] AS [Id25]
FROM [dbo].[Address] AS [Extent8]
LEFT JOIN [dbo].[Requester] AS [Extent9] ON ([Extent8].[Id] = [Extent9].[RegisteredAddress])
AND ([Extent9].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent10] ON ([Extent8].[Id] = [Extent10].[ResidenceAddress])
AND ([Extent10].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent11] ON ([Extent8].[Id] = [Extent11].[MailingAddress])
AND ([Extent11].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent12] ON ([Extent8].[Id] = [Extent12].[CompanySeatAddress])
AND ([Extent12].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent13] ON ([Extent8].[Id] = [Extent13].[WorkplaceAddress])
AND ([Extent13].[WorkplaceAddress] IS NOT NULL)
) AS [Join11] ON [Extent1].[Id] = [Join11].[Id25]
LEFT JOIN (
SELECT [Extent16].[Id] AS [Id3],
[Extent17].[Id] AS [Id26]
FROM [dbo].[Address] AS [Extent14]
LEFT JOIN [dbo].[Requester] AS [Extent15] ON ([Extent14].[Id] = [Extent15].[RegisteredAddress])
AND ([Extent15].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent16] ON ([Extent14].[Id] = [Extent16].[ResidenceAddress])
AND ([Extent16].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent17] ON ([Extent14].[Id] = [Extent17].[MailingAddress])
AND ([Extent17].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent18] ON ([Extent14].[Id] = [Extent18].[CompanySeatAddress])
AND ([Extent18].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent19] ON ([Extent14].[Id] = [Extent19].[WorkplaceAddress])
AND ([Extent19].[WorkplaceAddress] IS NOT NULL)
) AS [Join17] ON [Extent1].[Id] = [Join17].[Id26]
LEFT JOIN (
SELECT [Extent23].[Id] AS [Id4]
FROM [dbo].[Address] AS [Extent20]
LEFT JOIN [dbo].[Requester] AS [Extent21] ON ([Extent20].[Id] = [Extent21].[RegisteredAddress])
AND ([Extent21].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent22] ON ([Extent20].[Id] = [Extent22].[ResidenceAddress])
AND ([Extent22].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent23] ON ([Extent20].[Id] = [Extent23].[MailingAddress])
AND ([Extent23].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent24] ON ([Extent20].[Id] = [Extent24].[CompanySeatAddress])
AND ([Extent24].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent25] ON ([Extent20].[Id] = [Extent25].[WorkplaceAddress])
AND ([Extent25].[WorkplaceAddress] IS NOT NULL)
) AS [Join23] ON [Extent1].[Id] = [Join23].[Id4]
LEFT JOIN (
SELECT [Extent29].[Id] AS [Id27],
[Extent30].[Id] AS [Id5]
FROM [dbo].[Address] AS [Extent26]
LEFT JOIN [dbo].[Requester] AS [Extent27] ON ([Extent26].[Id] = [Extent27].[RegisteredAddress])
AND ([Extent27].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent28] ON ([Extent26].[Id] = [Extent28].[ResidenceAddress])
AND ([Extent28].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent29] ON ([Extent26].[Id] = [Extent29].[MailingAddress])
AND ([Extent29].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent30] ON ([Extent26].[Id] = [Extent30].[CompanySeatAddress])
AND ([Extent30].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent31] ON ([Extent26].[Id] = [Extent31].[WorkplaceAddress])
AND ([Extent31].[WorkplaceAddress] IS NOT NULL)
) AS [Join29] ON [Extent1].[Id] = [Join29].[Id27]
LEFT JOIN (
SELECT [Extent35].[Id] AS [Id28],
[Extent37].[Id] AS [Id6]
FROM [dbo].[Address] AS [Extent32]
LEFT JOIN [dbo].[Requester] AS [Extent33] ON ([Extent32].[Id] = [Extent33].[RegisteredAddress])
AND ([Extent33].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent34] ON ([Extent32].[Id] = [Extent34].[ResidenceAddress])
AND ([Extent34].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent35] ON ([Extent32].[Id] = [Extent35].[MailingAddress])
AND ([Extent35].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent36] ON ([Extent32].[Id] = [Extent36].[CompanySeatAddress])
AND ([Extent36].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent37] ON ([Extent32].[Id] = [Extent37].[WorkplaceAddress])
AND ([Extent37].[WorkplaceAddress] IS NOT NULL)
) AS [Join35] ON [Extent1].[Id] = [Join35].[Id28]
LEFT JOIN (
SELECT [Extent38].[Id] AS [Id7],
[Extent38].[AddressLine1] AS [AddressLine1],
[Extent38].[AddressLine2] AS [AddressLine2],
[Extent38].[ZipCode] AS [ZipCode],
[Extent38].[Post] AS [Post],
[Extent40].[Id] AS [Id29]
FROM [dbo].[Address] AS [Extent38]
LEFT JOIN [dbo].[Requester] AS [Extent39] ON ([Extent38].[Id] = [Extent39].[RegisteredAddress])
AND ([Extent39].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent40] ON ([Extent38].[Id] = [Extent40].[ResidenceAddress])
AND ([Extent40].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent41] ON ([Extent38].[Id] = [Extent41].[MailingAddress])
AND ([Extent41].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent42] ON ([Extent38].[Id] = [Extent42].[CompanySeatAddress])
AND ([Extent42].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent43] ON ([Extent38].[Id] = [Extent43].[WorkplaceAddress])
AND ([Extent43].[WorkplaceAddress] IS NOT NULL)
) AS [Join41] ON [Extent1].[Id] = [Join41].[Id29]
LEFT JOIN (
SELECT [Extent45].[Id] AS [Id8],
[Extent46].[Id] AS [Id30]
FROM [dbo].[Address] AS [Extent44]
LEFT JOIN [dbo].[Requester] AS [Extent45] ON ([Extent44].[Id] = [Extent45].[RegisteredAddress])
AND ([Extent45].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent46] ON ([Extent44].[Id] = [Extent46].[ResidenceAddress])
AND ([Extent46].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent47] ON ([Extent44].[Id] = [Extent47].[MailingAddress])
AND ([Extent47].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent48] ON ([Extent44].[Id] = [Extent48].[CompanySeatAddress])
AND ([Extent48].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent49] ON ([Extent44].[Id] = [Extent49].[WorkplaceAddress])
AND ([Extent49].[WorkplaceAddress] IS NOT NULL)
) AS [Join47] ON [Extent1].[Id] = [Join47].[Id30]
LEFT JOIN (
SELECT [Extent52].[Id] AS [Id9]
FROM [dbo].[Address] AS [Extent50]
LEFT JOIN [dbo].[Requester] AS [Extent51] ON ([Extent50].[Id] = [Extent51].[RegisteredAddress])
AND ([Extent51].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent52] ON ([Extent50].[Id] = [Extent52].[ResidenceAddress])
AND ([Extent52].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent53] ON ([Extent50].[Id] = [Extent53].[MailingAddress])
AND ([Extent53].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent54] ON ([Extent50].[Id] = [Extent54].[CompanySeatAddress])
AND ([Extent54].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent55] ON ([Extent50].[Id] = [Extent55].[WorkplaceAddress])
AND ([Extent55].[WorkplaceAddress] IS NOT NULL)
) AS [Join53] ON [Extent1].[Id] = [Join53].[Id9]
LEFT JOIN (
SELECT [Extent58].[Id] AS [Id31],
[Extent59].[Id] AS [Id10]
FROM [dbo].[Address] AS [Extent56]
LEFT JOIN [dbo].[Requester] AS [Extent57] ON ([Extent56].[Id] = [Extent57].[RegisteredAddress])
AND ([Extent57].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent58] ON ([Extent56].[Id] = [Extent58].[ResidenceAddress])
AND ([Extent58].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent59] ON ([Extent56].[Id] = [Extent59].[MailingAddress])
AND ([Extent59].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent60] ON ([Extent56].[Id] = [Extent60].[CompanySeatAddress])
AND ([Extent60].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent61] ON ([Extent56].[Id] = [Extent61].[WorkplaceAddress])
AND ([Extent61].[WorkplaceAddress] IS NOT NULL)
) AS [Join59] ON [Extent1].[Id] = [Join59].[Id31]
LEFT JOIN (
SELECT [Extent64].[Id] AS [Id32],
[Extent66].[Id] AS [Id11]
FROM [dbo].[Address] AS [Extent62]
LEFT JOIN [dbo].[Requester] AS [Extent63] ON ([Extent62].[Id] = [Extent63].[RegisteredAddress])
AND ([Extent63].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent64] ON ([Extent62].[Id] = [Extent64].[ResidenceAddress])
AND ([Extent64].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent65] ON ([Extent62].[Id] = [Extent65].[MailingAddress])
AND ([Extent65].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent66] ON ([Extent62].[Id] = [Extent66].[CompanySeatAddress])
AND ([Extent66].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent67] ON ([Extent62].[Id] = [Extent67].[WorkplaceAddress])
AND ([Extent67].[WorkplaceAddress] IS NOT NULL)
) AS [Join65] ON [Extent1].[Id] = [Join65].[Id32]
LEFT JOIN (
SELECT [Extent70].[Id] AS [Id33],
[Extent73].[Id] AS [Id12]
FROM [dbo].[Address] AS [Extent68]
LEFT JOIN [dbo].[Requester] AS [Extent69] ON ([Extent68].[Id] = [Extent69].[RegisteredAddress])
AND ([Extent69].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent70] ON ([Extent68].[Id] = [Extent70].[ResidenceAddress])
AND ([Extent70].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent71] ON ([Extent68].[Id] = [Extent71].[MailingAddress])
AND ([Extent71].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent72] ON ([Extent68].[Id] = [Extent72].[CompanySeatAddress])
AND ([Extent72].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent73] ON ([Extent68].[Id] = [Extent73].[WorkplaceAddress])
AND ([Extent73].[WorkplaceAddress] IS NOT NULL)
) AS [Join71] ON [Extent1].[Id] = [Join71].[Id33]
LEFT JOIN (
SELECT [Extent74].[Id] AS [Id13],
[Extent74].[AddressLine1] AS [AddressLine1],
[Extent74].[AddressLine2] AS [AddressLine2],
[Extent74].[ZipCode] AS [ZipCode],
[Extent74].[Post] AS [Post],
[Extent75].[Id] AS [Id34]
FROM [dbo].[Address] AS [Extent74]
LEFT JOIN [dbo].[Requester] AS [Extent75] ON ([Extent74].[Id] = [Extent75].[RegisteredAddress])
AND ([Extent75].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent76] ON ([Extent74].[Id] = [Extent76].[ResidenceAddress])
AND ([Extent76].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent77] ON ([Extent74].[Id] = [Extent77].[MailingAddress])
AND ([Extent77].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent78] ON ([Extent74].[Id] = [Extent78].[CompanySeatAddress])
AND ([Extent78].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent79] ON ([Extent74].[Id] = [Extent79].[WorkplaceAddress])
AND ([Extent79].[WorkplaceAddress] IS NOT NULL)
) AS [Join77] ON [Extent1].[Id] = [Join77].[Id34]
LEFT JOIN (
SELECT [Extent81].[Id] AS [Id14]
FROM [dbo].[Address] AS [Extent80]
LEFT JOIN [dbo].[Requester] AS [Extent81] ON ([Extent80].[Id] = [Extent81].[RegisteredAddress])
AND ([Extent81].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent82] ON ([Extent80].[Id] = [Extent82].[ResidenceAddress])
AND ([Extent82].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent83] ON ([Extent80].[Id] = [Extent83].[MailingAddress])
AND ([Extent83].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent84] ON ([Extent80].[Id] = [Extent84].[CompanySeatAddress])
AND ([Extent84].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent85] ON ([Extent80].[Id] = [Extent85].[WorkplaceAddress])
AND ([Extent85].[WorkplaceAddress] IS NOT NULL)
) AS [Join83] ON [Extent1].[Id] = [Join83].[Id14]
LEFT JOIN (
SELECT [Extent87].[Id] AS [Id35],
[Extent88].[Id] AS [Id15]
FROM [dbo].[Address] AS [Extent86]
LEFT JOIN [dbo].[Requester] AS [Extent87] ON ([Extent86].[Id] = [Extent87].[RegisteredAddress])
AND ([Extent87].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent88] ON ([Extent86].[Id] = [Extent88].[ResidenceAddress])
AND ([Extent88].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent89] ON ([Extent86].[Id] = [Extent89].[MailingAddress])
AND ([Extent89].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent90] ON ([Extent86].[Id] = [Extent90].[CompanySeatAddress])
AND ([Extent90].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent91] ON ([Extent86].[Id] = [Extent91].[WorkplaceAddress])
AND ([Extent91].[WorkplaceAddress] IS NOT NULL)
) AS [Join89] ON [Extent1].[Id] = [Join89].[Id35]
LEFT JOIN (
SELECT [Extent93].[Id] AS [Id36],
[Extent95].[Id] AS [Id16]
FROM [dbo].[Address] AS [Extent92]
LEFT JOIN [dbo].[Requester] AS [Extent93] ON ([Extent92].[Id] = [Extent93].[RegisteredAddress])
AND ([Extent93].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent94] ON ([Extent92].[Id] = [Extent94].[ResidenceAddress])
AND ([Extent94].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent95] ON ([Extent92].[Id] = [Extent95].[MailingAddress])
AND ([Extent95].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent96] ON ([Extent92].[Id] = [Extent96].[CompanySeatAddress])
AND ([Extent96].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent97] ON ([Extent92].[Id] = [Extent97].[WorkplaceAddress])
AND ([Extent97].[WorkplaceAddress] IS NOT NULL)
) AS [Join95] ON [Extent1].[Id] = [Join95].[Id36]
LEFT JOIN (
SELECT [Extent99].[Id] AS [Id37],
[Extent102].[Id] AS [Id17]
FROM [dbo].[Address] AS [Extent98]
LEFT JOIN [dbo].[Requester] AS [Extent99] ON ([Extent98].[Id] = [Extent99].[RegisteredAddress])
AND ([Extent99].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent100] ON ([Extent98].[Id] = [Extent100].[ResidenceAddress])
AND ([Extent100].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent101] ON ([Extent98].[Id] = [Extent101].[MailingAddress])
AND ([Extent101].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent102] ON ([Extent98].[Id] = [Extent102].[CompanySeatAddress])
AND ([Extent102].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent103] ON ([Extent98].[Id] = [Extent103].[WorkplaceAddress])
AND ([Extent103].[WorkplaceAddress] IS NOT NULL)
) AS [Join101] ON [Extent1].[Id] = [Join101].[Id37]
LEFT JOIN (
SELECT [Extent105].[Id] AS [Id38],
[Extent109].[Id] AS [Id18]
FROM [dbo].[Address] AS [Extent104]
LEFT JOIN [dbo].[Requester] AS [Extent105] ON ([Extent104].[Id] = [Extent105].[RegisteredAddress])
AND ([Extent105].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent106] ON ([Extent104].[Id] = [Extent106].[ResidenceAddress])
AND ([Extent106].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent107] ON ([Extent104].[Id] = [Extent107].[MailingAddress])
AND ([Extent107].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent108] ON ([Extent104].[Id] = [Extent108].[CompanySeatAddress])
AND ([Extent108].[CompanySeatAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent109] ON ([Extent104].[Id] = [Extent109].[WorkplaceAddress])
AND ([Extent109].[WorkplaceAddress] IS NOT NULL)
) AS [Join107] ON [Extent1].[Id] = [Join107].[Id38]
LEFT JOIN (
SELECT [Extent110].[Id] AS [Id19],
[Extent110].[AddressLine1] AS [AddressLine1],
[Extent110].[AddressLine2] AS [AddressLine2],
[Extent110].[ZipCode] AS [ZipCode],
[Extent110].[Post] AS [Post]
FROM [dbo].[Address] AS [Extent110]
LEFT JOIN [dbo].[Requester] AS [Extent111] ON ([Extent110].[Id] = [Extent111].[RegisteredAddress])
AND ([Extent111].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent112] ON ([Extent110].[Id] = [Extent112].[ResidenceAddress])
AND ([Extent112].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent113] ON ([Extent110].[Id] = [Extent113].[MailingAddress])
AND ([Extent113].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent114] ON ([Extent110].[Id] = [Extent114].[CompanySeatAddress])
AND ([Extent114].[CompanySeatAddress] IS NOT NULL)
) AS [Join112] ON ([Join112].[Id19] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
LEFT JOIN (
SELECT [Extent115].[Id] AS [Id39],
[Extent116].[Id] AS [Id20]
FROM [dbo].[Address] AS [Extent115]
LEFT JOIN [dbo].[Requester] AS [Extent116] ON ([Extent115].[Id] = [Extent116].[RegisteredAddress])
AND ([Extent116].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent117] ON ([Extent115].[Id] = [Extent117].[ResidenceAddress])
AND ([Extent117].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent118] ON ([Extent115].[Id] = [Extent118].[MailingAddress])
AND ([Extent118].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent119] ON ([Extent115].[Id] = [Extent119].[CompanySeatAddress])
AND ([Extent119].[CompanySeatAddress] IS NOT NULL)
) AS [Join117] ON ([Join117].[Id39] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
LEFT JOIN (
SELECT [Extent120].[Id] AS [Id40],
[Extent122].[Id] AS [Id21]
FROM [dbo].[Address] AS [Extent120]
LEFT JOIN [dbo].[Requester] AS [Extent121] ON ([Extent120].[Id] = [Extent121].[RegisteredAddress])
AND ([Extent121].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent122] ON ([Extent120].[Id] = [Extent122].[ResidenceAddress])
AND ([Extent122].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent123] ON ([Extent120].[Id] = [Extent123].[MailingAddress])
AND ([Extent123].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent124] ON ([Extent120].[Id] = [Extent124].[CompanySeatAddress])
AND ([Extent124].[CompanySeatAddress] IS NOT NULL)
) AS [Join122] ON ([Join122].[Id40] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
LEFT JOIN (
SELECT [Extent125].[Id] AS [Id41],
[Extent128].[Id] AS [Id22]
FROM [dbo].[Address] AS [Extent125]
LEFT JOIN [dbo].[Requester] AS [Extent126] ON ([Extent125].[Id] = [Extent126].[RegisteredAddress])
AND ([Extent126].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent127] ON ([Extent125].[Id] = [Extent127].[ResidenceAddress])
AND ([Extent127].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent128] ON ([Extent125].[Id] = [Extent128].[MailingAddress])
AND ([Extent128].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent129] ON ([Extent125].[Id] = [Extent129].[CompanySeatAddress])
AND ([Extent129].[CompanySeatAddress] IS NOT NULL)
) AS [Join127] ON ([Join127].[Id41] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
LEFT JOIN (
SELECT [Extent130].[Id] AS [Id42],
[Extent134].[Id] AS [Id23]
FROM [dbo].[Address] AS [Extent130]
LEFT JOIN [dbo].[Requester] AS [Extent131] ON ([Extent130].[Id] = [Extent131].[RegisteredAddress])
AND ([Extent131].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent132] ON ([Extent130].[Id] = [Extent132].[ResidenceAddress])
AND ([Extent132].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent133] ON ([Extent130].[Id] = [Extent133].[MailingAddress])
AND ([Extent133].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent134] ON ([Extent130].[Id] = [Extent134].[CompanySeatAddress])
AND ([Extent134].[CompanySeatAddress] IS NOT NULL)
) AS [Join132] ON ([Join132].[Id42] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
LEFT JOIN (
SELECT [Extent135].[Id] AS [Id43]
FROM [dbo].[Address] AS [Extent135]
LEFT JOIN [dbo].[Requester] AS [Extent136] ON ([Extent135].[Id] = [Extent136].[RegisteredAddress])
AND ([Extent136].[RegisteredAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent137] ON ([Extent135].[Id] = [Extent137].[ResidenceAddress])
AND ([Extent137].[ResidenceAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent138] ON ([Extent135].[Id] = [Extent138].[MailingAddress])
AND ([Extent138].[MailingAddress] IS NOT NULL)
LEFT JOIN [dbo].[Requester] AS [Extent139] ON ([Extent135].[Id] = [Extent139].[CompanySeatAddress])
AND ([Extent139].[CompanySeatAddress] IS NOT NULL)
) AS [Join137] ON ([Join137].[Id43] = [Extent1].[WorkplaceAddress])
AND ([Extent1].[WorkplaceAddress] IS NOT NULL)
答案 0 :(得分:1)
可能WithOptionalDependent
搞砸了。不幸的是,我没有设置数据库来彻底测试它。
我能够测试的常规,最小(* - 0/1)
关系是Person
- &gt; Contact
在以下设置中:
Person:
Id
Name
PrimaryContactId (+ navigation property)
SecondaryContactId (+ navigation property)
Contact:
Id
Description
人员地图:
public class PersonMap : EntityTypeConfiguration<Person>
{
HasKey(t => t.Id);
Property(t => t.Name).IsRequired().HasMaxLength(30);
ToTable("People");
Property(t => t.Id).HasColumnName("Id");
Property(t => t.Name).HasColumnName("Name");
HasOptional(t => t.PrimaryContact).WithMany(t => t.PrimaryContacts)
.HasForeignKey(t => t.PrimaryContactId);
HasOptional(t => t.SecondaryContact).WithMany(t => t.SecondaryContacts)
.HasForeignKey(t => t.SecondaryContactId);
}
为此:
var all = context.Set<Person>().Include(x => x.PrimaryContact).Include(x => x.SecondaryContact).ToList();
生成的SQL如下所示:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent2].[Id] AS [Id1],
[Extent2].[Description] AS [Description],
[Extent3].[Id] AS [Id2],
[Extent3].[Description] AS [Description1]
FROM [dbo].[People] AS [Extent1]
LEFT OUTER JOIN [dbo].[Contacts] AS [Extent2] ON [Extent1].[PrimaryContactId] = [Extent2].[Id]
LEFT OUTER JOIN [dbo].[Contacts] AS [Extent3] ON [Extent1].[SecondaryContactId] = [Extent3].[Id]
非常标准。
考虑到这个例子在概念上是相似的,但有不同的映射,我的赌注在地图上。
我还让EntityFramework Power Tools为我生成现有数据库中的Code-First映射...:)
答案 1 :(得分:0)
是的,它会的。但除非它给你一个特定的性能问题,否则我会忽略它。
实体框架专为不能或不想理解SQL的人设计。