我有多個連接和2組連接的查詢。該組加入的是可添加1個或更多記錄的子記錄,並且我想將它們全部顯示出來。 該查詢有效,但速度非常慢。 當使用多於一個組連接時,實體框架將其作爲union all寫入。這是我不明白的地方。 有沒有一種方法來重寫查詢,以便ef不會將它寫爲union all?還是我必須找到另一種解決方案?爲什麼實體框架Lambda將2個組聯接轉換爲Union All?
這是拉姆達代碼
var query = db.DocumentModsums
.Join(db.Documents,
data => data.DocumentId,
d => d.Id,
(data, d) => new
{
DocumentModsum = data,
Document = d,
})
.Join(db.Modsums,
data => data.DocumentModsum.ModsumId,
m => m.Id,
(data, m) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = m,
})
.Join(db.MethodsOwnerships,
data => data.Document.MethodsOwnershipId,
mo => mo.Id,
(data, mo) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = mo,
})
.Join(db.DocumentStatus,
data => data.Document.DocumentStatusId,
ds => ds.Id,
(data, ds) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = data.MethodsOwnership,
DocumentStatus = ds,
})
.Join(db.DocumentTypes,
data => data.Document.DocumentTypeId,
dt => dt.Id,
(data, dt) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = data.MethodsOwnership,
DocumentStatus = data.DocumentStatus,
DocumentType = dt,
})
.Join(db.ModsumStatus,
data => data.Modsum.ModsumStatusId,
ms => ms.Id,
(data, ms) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = data.MethodsOwnership,
DocumentStatus = data.DocumentStatus,
DocumentType = data.DocumentType,
ModsumStatus = ms,
})
.Join(db.ModsumTypes,
data => data.Modsum.ModsumTypeId,
mt => mt.Id,
(data, mt) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = data.MethodsOwnership,
DocumentStatus = data.DocumentStatus,
DocumentType = data.DocumentType,
ModsumStatus = data.ModsumStatus,
ModsumType = mt,
})
.GroupJoin(db.SummaryOfActions,
data => data.Document.Id,
soa => soa.DocumentId,
(data, soa) => new
{
DocumentModsum = data.DocumentModsum,
Document = data.Document,
Modsum = data.Modsum,
MethodsOwnership = data.MethodsOwnership,
DocumentStatus = data.DocumentStatus,
DocumentType = data.DocumentType,
ModsumStatus = data.ModsumStatus,
ModsumType = data.ModsumType,
CIN = soa.Join(db.CINs,
soa2 => soa2.CINId,
cin2 => cin2.Id,
(soa2, cin2) => new
{
CIN = cin2,
SOA = soa2
}
).Where(s => s.SOA.DeletedAt == null && s.CIN.DeletedAt == null)
.GroupBy(c => new { c.CIN.CINName })
.Select(c => c.Key.CINName)
.ToList()
})
.GroupJoin(
db.ModsumEffectivities,
data => data.Modsum.Id,
me => me.ModsumId,
(data, me) => new
{
Data = data,
ModsumEffectivity = me.Where(meff => meff.DeletedAt == null).Select(m2 => new ModsumEffectivityVM()
{
AircraftFrom = m2.AircraftFromId.ToString(),
AircraftFromId = m2.AircraftFromId,
AircraftTo = m2.AircraftToId.ToString(),
AircraftToId = m2.AircraftToId,
AircraftModelId = m2.AircraftModelId
})
.ToList()
})
.Where(dm => dm.Data.DocumentModsum.DeletedAt == null
&& dm.Data.Document.DeletedAt == null
&& dm.Data.Modsum.DeletedAt == null
&& dm.Data.MethodsOwnership.DeletedAt == null
&& dm.Data.DocumentStatus.DeletedAt == null
&& dm.Data.DocumentType.DeletedAt == null
&& dm.Data.ModsumStatus.DeletedAt == null
&& dm.Data.ModsumType.DeletedAt == null
)
.Select(data => new DocumentVM()
{
Id = data.Data.DocumentModsum.Id,
Status = data.Data.DocumentStatus.Description,
DocumentNumber = data.Data.Document.DocumentNumber,
DocumentRevision = data.Data.Document.DocumentRevision,
DocumentTitle = data.Data.Document.DocumentTitle,
ModsumNumber = data.Data.Modsum.ModsumNumber,
ModsumRevision = data.Data.Modsum.ModsumRevision,
ModsumTitle = data.Data.Modsum.ModsumTitle,
DocumentType = data.Data.DocumentType.Description,
MethodsOwnership = data.Data.MethodsOwnership.Description,
ModsumReleaseDate = data.Data.Modsum.MSReleaseDate,
ModsumAuthority = data.Data.Modsum.Authority ?? "",
CreatedAt = data.Data.DocumentModsum.CreatedAt,
CIN = data.Data.Document.CIN,
CINList = data.Data.CIN,
ModsumEffectivity = data.ModsumEffectivity,
}).ToList();
此轉換成
SELECT
[UnionAll1].[Id] AS [C1],
[UnionAll1].[Id1] AS [C2],
[UnionAll1].[Id2] AS [C3],
[UnionAll1].[Id3] AS [C4],
[UnionAll1].[Id4] AS [C5],
[UnionAll1].[Id5] AS [C6],
[UnionAll1].[Id6] AS [C7],
[UnionAll1].[C2] AS [C8],
[UnionAll1].[Id7] AS [C9],
[UnionAll1].[Description] AS [C10],
[UnionAll1].[DocumentNumber] AS [C11],
[UnionAll1].[DocumentRevision] AS [C12],
[UnionAll1].[DocumentTitle] AS [C13],
[UnionAll1].[ModsumNumber] AS [C14],
[UnionAll1].[ModsumRevision] AS [C15],
[UnionAll1].[ModsumTitle] AS [C16],
[UnionAll1].[Description1] AS [C17],
[UnionAll1].[Description2] AS [C18],
[UnionAll1].[MSReleaseDate1] AS [C19],
[UnionAll1].[C3] AS [C20],
[UnionAll1].[CreatedAt] AS [C21],
[UnionAll1].[CIN] AS [C22],
[UnionAll1].[C1] AS [C23],
[UnionAll1].[CINName] AS [C24],
[UnionAll1].[C4] AS [C25],
[UnionAll1].[C5] AS [C26]
FROM (SELECT
[Project3].[C1] AS [C1],
[Limit1].[MSReleaseDate] AS [MSReleaseDate],
[Limit1].[Id3] AS [Id],
[Limit1].[Id4] AS [Id1],
[Limit1].[Id5] AS [Id2],
[Limit1].[Id6] AS [Id3],
[Limit1].[Id7] AS [Id4],
[Limit1].[Id1] AS [Id5],
[Limit1].[Id2] AS [Id6],
[Limit1].[C1] AS [C2],
[Limit1].[Id] AS [Id7],
[Limit1].[Description1] AS [Description],
[Limit1].[DocumentNumber] AS [DocumentNumber],
[Limit1].[DocumentRevision] AS [DocumentRevision],
[Limit1].[DocumentTitle] AS [DocumentTitle],
[Limit1].[ModsumNumber] AS [ModsumNumber],
[Limit1].[ModsumRevision] AS [ModsumRevision],
[Limit1].[ModsumTitle] AS [ModsumTitle],
[Limit1].[Description2] AS [Description1],
[Limit1].[Description] AS [Description2],
[Limit1].[MSReleaseDate] AS [MSReleaseDate1],
[Limit1].[C2] AS [C3],
[Limit1].[CreatedAt] AS [CreatedAt],
[Limit1].[CIN] AS [CIN],
[Project3].[CINName] AS [CINName],
CAST(NULL AS int) AS [C4],
CAST(NULL AS bit) AS [C5]
FROM (SELECT [Project1].[Id] AS [Id], [Project1].[CreatedAt] AS [CreatedAt], [Project1].[Id1] AS [Id1], [Project1].[DocumentNumber] AS [DocumentNumber], [Project1].[DocumentRevision] AS [DocumentRevision], [Project1].[DocumentTitle] AS [DocumentTitle], [Project1].[CIN] AS [CIN], [Project1].[Id2] AS [Id2], [Project1].[ModsumNumber] AS [ModsumNumber], [Project1].[ModsumRevision] AS [ModsumRevision], [Project1].[ModsumTitle] AS [ModsumTitle], [Project1].[MSReleaseDate] AS [MSReleaseDate], [Project1].[Id3] AS [Id3], [Project1].[Description] AS [Description], [Project1].[Id4] AS [Id4], [Project1].[Description1] AS [Description1], [Project1].[Id5] AS [Id5], [Project1].[Description2] AS [Description2], [Project1].[Id6] AS [Id6], [Project1].[Id7] AS [Id7], [Project1].[C1] AS [C1], [Project1].[C2] AS [C2]
FROM (SELECT
[Filter1].[Id8] AS [Id],
[Filter1].[CreatedAt1] AS [CreatedAt],
[Filter1].[Id9] AS [Id1],
[Filter1].[DocumentNumber] AS [DocumentNumber],
[Filter1].[DocumentRevision] AS [DocumentRevision],
[Filter1].[DocumentTitle] AS [DocumentTitle],
[Filter1].[CIN] AS [CIN],
[Filter1].[Id10] AS [Id2],
[Filter1].[ModsumNumber] AS [ModsumNumber],
[Filter1].[ModsumRevision] AS [ModsumRevision],
[Filter1].[ModsumTitle] AS [ModsumTitle],
[Filter1].[MSReleaseDate] AS [MSReleaseDate],
[Filter1].[Id11] AS [Id3],
[Filter1].[Description3] AS [Description],
[Filter1].[Id12] AS [Id4],
[Filter1].[Description4] AS [Description1],
[Filter1].[Id13] AS [Id5],
[Filter1].[Description5] AS [Description2],
[Filter1].[Id14] AS [Id6],
[Extent8].[Id] AS [Id7],
1 AS [C1],
CASE WHEN ([Filter1].[Authority] IS NULL) THEN N'' ELSE [Filter1].[Authority] END AS [C2]
FROM (SELECT [Extent1].[Id] AS [Id8], [Extent1].[CreatedAt] AS [CreatedAt1], [Extent2].[Id] AS [Id9], [Extent2].[DocumentNumber] AS [DocumentNumber], [Extent2].[DocumentRevision] AS [DocumentRevision], [Extent2].[DocumentTitle] AS [DocumentTitle], [Extent2].[CIN] AS [CIN], [Extent3].[Id] AS [Id10], [Extent3].[ModsumNumber] AS [ModsumNumber], [Extent3].[ModsumRevision] AS [ModsumRevision], [Extent3].[ModsumTitle] AS [ModsumTitle], [Extent3].[MSReleaseDate] AS [MSReleaseDate], [Extent3].[ModsumTypeId] AS [ModsumTypeId], [Extent3].[Authority] AS [Authority], [Extent4].[Id] AS [Id11], [Extent4].[Description] AS [Description3], [Extent5].[Id] AS [Id12], [Extent5].[Description] AS [Description4], [Extent6].[Id] AS [Id13], [Extent6].[Description] AS [Description5], [Extent7].[Id] AS [Id14]
FROM [dbo].[DocumentModsums] AS [Extent1]
INNER JOIN [dbo].[Documents] AS [Extent2] ON [Extent1].[DocumentId] = [Extent2].[Id]
INNER JOIN [dbo].[Modsums] AS [Extent3] ON [Extent1].[ModsumId] = [Extent3].[Id]
INNER JOIN [dbo].[MethodsOwnerships] AS [Extent4] ON [Extent2].[MethodsOwnershipId] = [Extent4].[Id]
INNER JOIN [dbo].[DocumentStatus] AS [Extent5] ON [Extent2].[DocumentStatusId] = [Extent5].[Id]
INNER JOIN [dbo].[DocumentTypes] AS [Extent6] ON [Extent2].[DocumentTypeId] = [Extent6].[Id]
INNER JOIN [dbo].[ModsumStatus] AS [Extent7] ON [Extent3].[ModsumStatusId] = [Extent7].[Id]
WHERE ([Extent1].[DeletedAt] IS NULL) AND ([Extent2].[DeletedAt] IS NULL) AND ([Extent3].[DeletedAt] IS NULL) AND ([Extent4].[DeletedAt] IS NULL) AND ([Extent5].[DeletedAt] IS NULL) AND ([Extent6].[DeletedAt] IS NULL) AND ([Extent7].[DeletedAt] IS NULL)) AS [Filter1]
INNER JOIN [dbo].[ModsumTypes] AS [Extent8] ON [Filter1].[ModsumTypeId] = [Extent8].[Id]
WHERE [Extent8].[DeletedAt] IS NULL
) AS [Project1]
ORDER BY [Project1].[MSReleaseDate] DESC
OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY ) AS [Limit1]
OUTER APPLY (SELECT
[Distinct1].[CINName] AS [CINName],
1 AS [C1]
FROM (SELECT DISTINCT
[Extent10].[CINName] AS [CINName]
FROM [dbo].[SummaryOfActions] AS [Extent9]
INNER JOIN [dbo].[CINs] AS [Extent10] ON [Extent9].[CINId] = [Extent10].[Id]
WHERE ([Limit1].[Id1] = [Extent9].[DocumentId]) AND ([Extent9].[DeletedAt] IS NULL) AND ([Extent10].[DeletedAt] IS NULL)
) AS [Distinct1]) AS [Project3]
UNION ALL
SELECT
2 AS [C1],
[Limit2].[MSReleaseDate] AS [MSReleaseDate],
[Limit2].[Id3] AS [Id],
[Limit2].[Id4] AS [Id1],
[Limit2].[Id5] AS [Id2],
[Limit2].[Id6] AS [Id3],
[Limit2].[Id7] AS [Id4],
[Limit2].[Id1] AS [Id5],
[Limit2].[Id2] AS [Id6],
[Limit2].[Id] AS [Id7],
[Limit2].[Id] AS [Id8],
[Limit2].[Description1] AS [Description],
[Limit2].[DocumentNumber] AS [DocumentNumber],
[Limit2].[DocumentRevision] AS [DocumentRevision],
[Limit2].[DocumentTitle] AS [DocumentTitle],
[Limit2].[ModsumNumber] AS [ModsumNumber],
[Limit2].[ModsumRevision] AS [ModsumRevision],
[Limit2].[ModsumTitle] AS [ModsumTitle],
[Limit2].[Description2] AS [Description1],
[Limit2].[Description] AS [Description2],
[Limit2].[MSReleaseDate] AS [MSReleaseDate1],
[Limit2].[C1] AS [C2],
[Limit2].[CreatedAt] AS [CreatedAt],
[Limit2].[CIN] AS [CIN],
CAST(NULL AS varchar(1)) AS [C3],
[Extent19].[ModsumId] AS [ModsumId],
cast(1 as bit) AS [C4]
FROM (SELECT [Project5].[Id] AS [Id], [Project5].[CreatedAt] AS [CreatedAt], [Project5].[Id1] AS [Id1], [Project5].[DocumentNumber] AS [DocumentNumber], [Project5].[DocumentRevision] AS [DocumentRevision], [Project5].[DocumentTitle] AS [DocumentTitle], [Project5].[CIN] AS [CIN], [Project5].[Id2] AS [Id2], [Project5].[ModsumNumber] AS [ModsumNumber], [Project5].[ModsumRevision] AS [ModsumRevision], [Project5].[ModsumTitle] AS [ModsumTitle], [Project5].[MSReleaseDate] AS [MSReleaseDate], [Project5].[Id3] AS [Id3], [Project5].[Description] AS [Description], [Project5].[Id4] AS [Id4], [Project5].[Description1] AS [Description1], [Project5].[Id5] AS [Id5], [Project5].[Description2] AS [Description2], [Project5].[Id6] AS [Id6], [Project5].[Id7] AS [Id7], [Project5].[C1] AS [C1]
FROM (SELECT
[Filter4].[Id15] AS [Id],
[Filter4].[CreatedAt2] AS [CreatedAt],
[Filter4].[Id16] AS [Id1],
[Filter4].[DocumentNumber] AS [DocumentNumber],
[Filter4].[DocumentRevision] AS [DocumentRevision],
[Filter4].[DocumentTitle] AS [DocumentTitle],
[Filter4].[CIN] AS [CIN],
[Filter4].[Id17] AS [Id2],
[Filter4].[ModsumNumber] AS [ModsumNumber],
[Filter4].[ModsumRevision] AS [ModsumRevision],
[Filter4].[ModsumTitle] AS [ModsumTitle],
[Filter4].[MSReleaseDate] AS [MSReleaseDate],
[Filter4].[Id18] AS [Id3],
[Filter4].[Description6] AS [Description],
[Filter4].[Id19] AS [Id4],
[Filter4].[Description7] AS [Description1],
[Filter4].[Id20] AS [Id5],
[Filter4].[Description8] AS [Description2],
[Filter4].[Id21] AS [Id6],
[Extent18].[Id] AS [Id7],
CASE WHEN ([Filter4].[Authority] IS NULL) THEN N'' ELSE [Filter4].[Authority] END AS [C1]
FROM (SELECT [Extent11].[Id] AS [Id15], [Extent11].[CreatedAt] AS [CreatedAt2], [Extent12].[Id] AS [Id16], [Extent12].[DocumentNumber] AS [DocumentNumber], [Extent12].[DocumentRevision] AS [DocumentRevision], [Extent12].[DocumentTitle] AS [DocumentTitle], [Extent12].[CIN] AS [CIN], [Extent13].[Id] AS [Id17], [Extent13].[ModsumNumber] AS [ModsumNumber], [Extent13].[ModsumRevision] AS [ModsumRevision], [Extent13].[ModsumTitle] AS [ModsumTitle], [Extent13].[MSReleaseDate] AS [MSReleaseDate], [Extent13].[ModsumTypeId] AS [ModsumTypeId], [Extent13].[Authority] AS [Authority], [Extent14].[Id] AS [Id18], [Extent14].[Description] AS [Description6], [Extent15].[Id] AS [Id19], [Extent15].[Description] AS [Description7], [Extent16].[Id] AS [Id20], [Extent16].[Description] AS [Description8], [Extent17].[Id] AS [Id21]
FROM [dbo].[DocumentModsums] AS [Extent11]
INNER JOIN [dbo].[Documents] AS [Extent12] ON [Extent11].[DocumentId] = [Extent12].[Id]
INNER JOIN [dbo].[Modsums] AS [Extent13] ON [Extent11].[ModsumId] = [Extent13].[Id]
INNER JOIN [dbo].[MethodsOwnerships] AS [Extent14] ON [Extent12].[MethodsOwnershipId] = [Extent14].[Id]
INNER JOIN [dbo].[DocumentStatus] AS [Extent15] ON [Extent12].[DocumentStatusId] = [Extent15].[Id]
INNER JOIN [dbo].[DocumentTypes] AS [Extent16] ON [Extent12].[DocumentTypeId] = [Extent16].[Id]
INNER JOIN [dbo].[ModsumStatus] AS [Extent17] ON [Extent13].[ModsumStatusId] = [Extent17].[Id]
WHERE ([Extent11].[DeletedAt] IS NULL) AND ([Extent12].[DeletedAt] IS NULL) AND ([Extent13].[DeletedAt] IS NULL) AND ([Extent14].[DeletedAt] IS NULL) AND ([Extent15].[DeletedAt] IS NULL) AND ([Extent16].[DeletedAt] IS NULL) AND ([Extent17].[DeletedAt] IS NULL)) AS [Filter4]
INNER JOIN [dbo].[ModsumTypes] AS [Extent18] ON [Filter4].[ModsumTypeId] = [Extent18].[Id]
WHERE [Extent18].[DeletedAt] IS NULL
) AS [Project5]
ORDER BY [Project5].[MSReleaseDate] DESC
OFFSET 0 ROWS FETCH NEXT 25 ROWS ONLY ) AS [Limit2]
INNER JOIN [dbo].[ModsumEffectivities] AS [Extent19] ON [Limit2].[Id2] = [Extent19].[ModsumId]) AS [UnionAll1]
ORDER BY [UnionAll1].[MSReleaseDate] DESC, [UnionAll1].[Id] ASC, [UnionAll1].[Id1] ASC, [UnionAll1].[Id2] ASC, [UnionAll1].[Id3] ASC, [UnionAll1].[Id4] ASC, [UnionAll1].[Id5] ASC, [UnionAll1].[Id6] ASC, [UnionAll1].[Id7] ASC, [UnionAll1].[C1] ASC
你有沒有考慮讓SQL Server中的觀點,即返回所需值。 Sql在處理連接方面比EF更好。 –