Ich versuche zu verstehen, warum Join in meinem Fall schneller als Anweisung, die Navigationseigenschaft verwenden, beizutreten. Ich habe zwei Fragen.Entity Framework-Leistung Join vs Navigationseigenschaft
Zuerst mit Navigationseigenschaft:
var result = (from users in context.MetricBloodPreasure
orderby users.User.LastName, users.User.FirstName
select new
{
UserName = users.User.LastName + ", " + users.User.FirstName,
Date = users.DateOfValue,
}).ToList();
Generatet sql:
SELECT
[Project1].[C1] AS [C1],
[Project1].[C2] AS [C2],
[Project1].[DateOfValue] AS [DateOfValue]
FROM (SELECT
[Extent1].[DateOfValue] AS [DateOfValue],
[Extent2].[FirstName] AS [FirstName],
[Extent2].[LastName] AS [LastName],
1 AS [C1],
CASE WHEN ([Extent2].[LastName] IS NULL) THEN N'' ELSE [Extent2].[LastName] END + N', ' + CASE WHEN ([Extent2].[FirstName] IS NULL) THEN N'' ELSE [Extent2].[FirstName] END AS [C2]
FROM [dbo].[MetricBloodPreasure] AS [Extent1]
INNER JOIN [dbo].[User] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[Id]
) AS [Project1]
ORDER BY [Project1].[LastName] ASC, [Project1].[FirstName] ASC
Zweite mit beitreten:
var result1 = (from u in context.User
orderby u.LastName, u.FirstName
join us in context.MetricBloodPreasure
on u.Id equals us.UserId into users
from s in users
select new
{
UserName = s.User.LastName + ", " + s.User.FirstName,
Date = s.DateOfValue,
}).ToList();
generierten SQL:
SELECT
1 AS [C1],
CASE WHEN ([Extent1].[LastName] IS NULL) THEN N'' ELSE [Extent1].[LastName] END + N', ' + CASE WHEN ([Extent1].[FirstName] IS NULL) THEN N'' ELSE [Extent1].[FirstName] END AS [C2],
[Extent2].[DateOfValue] AS [DateOfValue]
FROM [dbo].[User] AS [Extent1]
INNER JOIN [dbo].[MetricBloodPreasure] AS [Extent2] ON ([Extent1].[Id] = [Extent2].[UserId]) AND ([Extent2].[UserId] = [Extent1].[Id])
Bevor Sie die erste Abfrage ausführen, rufen Sie var user = context.User.FirstOrDefault();
auf, da ich denke, dass die Verbindung zur Datenbank einige Zeit braucht.
Ergebnisse: Navigation Eigenschaft query: 00: 00: 00,6719646 Abfrage Registriert: 00: 00: 00,4941169
auf Ergebnisse der Suche scheint es, dass Linq, dass die Verwendung abfragt statt Navigationseigenschaften schließt sich schneller. Ist das wahr oder mache ich etwas falsch?
Sie müssen auch den Cache aus der Datenbank zwischen den Abfragen löschen, um korrekte Ergebnisse zu erhalten, während Sie ToList() aufrufen. Trennen Sie die Abfragekonstruktion von der Materialisierung und benchmarken Sie diese. –
Die OrderBy scheint in der zweiten Abfrage nicht berücksichtigt zu werden. Dies kann die Ursache für den Unterschied sein, Sie können versuchen, ... von s in Benutzerreihenfolge durch u.LastName, u.FirstName ... ' – jbl